Skip to content

Commit 915d4a2

Browse files
committed
Update Java基础知识.md
1 parent 8af50f3 commit 915d4a2

File tree

1 file changed

+16
-27
lines changed

1 file changed

+16
-27
lines changed

docs/java/Java基础知识.md

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,8 @@
5959

6060
## 1. 面向对象和面向过程的区别
6161

62-
### 面向过程
63-
64-
**优点:** 性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发
65-
66-
**缺点:** 没有面向对象易维护、易复用、易扩展
67-
68-
### 面向对象
69-
70-
**优点:** 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
71-
72-
**缺点:** 性能比面向过程低
62+
- **面向过程****面向过程性能比面向对象高。** 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,**面向过程没有面向对象易维护、易复用、易扩展。**
63+
- **面向对象****面向对象易维护、易复用、易扩展。** 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,**面向过程性能比面向过程低**
7364

7465
## 2. Java 语言有哪些特点?
7566

@@ -100,7 +91,9 @@ Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同
10091

10192
> HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
10293
103-
总结:Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
94+
**总结:**
95+
96+
Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
10497

10598
### JDK 和 JRE
10699

@@ -120,7 +113,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
120113
>
121114
> 答:非常接近 - 我们的Oracle JDK版本构建过程基于OpenJDK 7构建,只添加了几个部分,例如部署代码,其中包括Oracle的Java插件和Java WebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源Oracle JDK的所有部分,除了我们考虑商业功能的部分。
122115
123-
总结:
116+
**总结:**
124117

125118
1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
126119
2. OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
@@ -145,7 +138,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
145138

146139
## 7. Java 应用程序与小程序之间有那些差别?
147140

148-
简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。
141+
简单说应用程序是从主线程启动(也就是 `main()` 方法)。applet 小程序没有 `main()` 方法,主要是嵌在浏览器页面上运行(调用`init()`或者`run()`来启动),嵌入浏览器这点跟 flash 的小游戏类似。
149142

150143
## 8. 字符型常量和字符串常量的区别?
151144

@@ -162,9 +155,8 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
162155

163156
## 10. 重载和重写的区别
164157

165-
**重载:** 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。   
166-
167-
**重写:** 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
158+
- **重载:** 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。   
159+
- **重写:** 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
168160

169161
## 11. Java 面向对象编程三大特性: 封装 继承 多态
170162

@@ -191,7 +183,6 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
191183
## 12. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
192184

193185
**可变性**
194-
 
195186

196187
简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
197188

@@ -213,8 +204,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
213204

214205
**线程安全性**
215206

216-
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilderStringBuilderStringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
217-
  
207+
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilderStringBuilderStringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。 
218208

219209
**性能**
220210

@@ -228,17 +218,16 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
228218

229219
## 13. 自动装箱与拆箱
230220

231-
**装箱**:将基本类型用它们对应的引用类型包装起来;
232-
233-
**拆箱**:将包装类型转换为基本数据类型;
221+
- **装箱**:将基本类型用它们对应的引用类型包装起来;
222+
- **拆箱**:将包装类型转换为基本数据类型;
234223

235224
## 14. 在一个静态方法内调用一个非静态成员为什么是非法的?
236225

237226
由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
238227

239228
## 15.Java 中定义一个不做事且没有参数的构造方法的作用
240229

241-
Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
230+
Java 程序在执行子类的构造方法之前,如果没有用 `super() `来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 `super() `来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
242231

243232
## 16. import java和javax有什么区别?
244233

@@ -489,12 +478,12 @@ Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很
489478

490479
按操作方式分类结构图:
491480

492-
![按操作方式分类结构图](https://user-gold-cdn.xitu.io/2018/5/16/16367d4fd1ce1b46?w=720&h=1080&f=jpeg&s=69522)
481+
![IO-操作方式分类](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/IO-操作方式分类.png)
493482

494483

495484
按操作对象分类结构图:
496485

497-
![按操作对象分类结构图](https://user-gold-cdn.xitu.io/2018/5/16/16367d673b0e268d?w=720&h=535&f=jpeg&s=46081)
486+
![IO-操作对象分类](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/IO-操作对象分类.png)
498487

499488
### BIO,NIO,AIO 有什么区别?
500489

@@ -524,4 +513,4 @@ Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很
524513

525514
**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
526515

527-
![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334)
516+
![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png)

0 commit comments

Comments
 (0)