59
59
60
60
## 1. 面向对象和面向过程的区别
61
61
62
- ### 面向过程
63
-
64
- ** 优点:** 性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发
65
-
66
- ** 缺点:** 没有面向对象易维护、易复用、易扩展
67
-
68
- ### 面向对象
69
-
70
- ** 优点:** 易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
71
-
72
- ** 缺点:** 性能比面向过程低
62
+ - ** 面向过程** :** 面向过程性能比面向对象高。** 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,** 面向过程没有面向对象易维护、易复用、易扩展。**
63
+ - ** 面向对象** :** 面向对象易维护、易复用、易扩展。** 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,** 面向过程性能比面向过程低** 。
73
64
74
65
## 2. Java 语言有哪些特点?
75
66
@@ -100,7 +91,9 @@ Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同
100
91
101
92
> HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
102
93
103
- 总结:Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
94
+ ** 总结:**
95
+
96
+ Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
104
97
105
98
### JDK 和 JRE
106
99
@@ -120,7 +113,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
120
113
>
121
114
> 答:非常接近 - 我们的Oracle JDK版本构建过程基于OpenJDK 7构建,只添加了几个部分,例如部署代码,其中包括Oracle的Java插件和Java WebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源Oracle JDK的所有部分,除了我们考虑商业功能的部分。
122
115
123
- 总结:
116
+ ** 总结:**
124
117
125
118
1 . Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
126
119
2 . OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
@@ -145,7 +138,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
145
138
146
139
## 7. Java 应用程序与小程序之间有那些差别?
147
140
148
- 简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有main方法 ,主要是嵌在浏览器页面上运行(调用init()线程或者run() 来启动),嵌入浏览器这点跟 flash 的小游戏类似。
141
+ 简单说应用程序是从主线程启动(也就是 ` main() ` 方法)。applet 小程序没有 ` main() ` 方法 ,主要是嵌在浏览器页面上运行(调用 ` init() ` 或者 ` run() ` 来启动),嵌入浏览器这点跟 flash 的小游戏类似。
149
142
150
143
## 8. 字符型常量和字符串常量的区别?
151
144
@@ -162,9 +155,8 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
162
155
163
156
## 10. 重载和重写的区别
164
157
165
- ** 重载:** 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
166
-
167
- ** 重写:** 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
158
+ - ** 重载:** 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
159
+ - ** 重写:** 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
168
160
169
161
## 11. Java 面向对象编程三大特性: 封装 继承 多态
170
162
@@ -191,7 +183,6 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
191
183
## 12. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
192
184
193
185
** 可变性**
194
-
195
186
196
187
简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,` private final char value[] ` ,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串` char[]value ` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
197
188
@@ -213,8 +204,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
213
204
214
205
** 线程安全性**
215
206
216
- String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
217
-
207
+ String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
218
208
219
209
** 性能**
220
210
@@ -228,17 +218,16 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
228
218
229
219
## 13. 自动装箱与拆箱
230
220
231
- ** 装箱** :将基本类型用它们对应的引用类型包装起来;
232
-
233
- ** 拆箱** :将包装类型转换为基本数据类型;
221
+ - ** 装箱** :将基本类型用它们对应的引用类型包装起来;
222
+ - ** 拆箱** :将包装类型转换为基本数据类型;
234
223
235
224
## 14. 在一个静态方法内调用一个非静态成员为什么是非法的?
236
225
237
226
由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
238
227
239
228
## 15. 在 Java 中定义一个不做事且没有参数的构造方法的作用
240
229
241
- Java 程序在执行子类的构造方法之前,如果没有用 super () 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super () 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
230
+ Java 程序在执行子类的构造方法之前,如果没有用 ` super () ` 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 ` super () ` 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
242
231
243
232
## 16. import java和javax有什么区别?
244
233
@@ -489,12 +478,12 @@ Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很
489
478
490
479
按操作方式分类结构图:
491
480
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 )
493
482
494
483
495
484
按操作对象分类结构图:
496
485
497
- ! [按操作对象分类结构图 ](https: // user-gold-cdn.xitu.io/2018/5/16/16367d673b0e268d?w=720&h=535&f=jpeg&s=46081 )
486
+ 
498
487
499
488
### BIO,NIO,AIO 有什么区别?
500
489
@@ -524,4 +513,4 @@ Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很
524
513
525
514
**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
526
515
527
- ! [我的公众号](https: // user-gold-cdn.xitu.io/2018/11/28/ 167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334 )
516
+ 
0 commit comments