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
1251181 . Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
1261192 . 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 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
217-
207+ String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 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+ 
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+ 
0 commit comments