Skip to content

Commit 7950140

Browse files
authored
Update Java基础知识.md
修改 “17. 接口和抽象类的区别是什么?”的解答。
1 parent 38b4378 commit 7950140

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

docs/java/Java基础知识.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -219,11 +219,13 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
219219
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
220220

221221
**对于三者使用的总结:**
222+
222223
1. 操作少量的数据: 适用String
223224
2. 单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
224225
3. 多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer
225226

226227
## 13. 自动装箱与拆箱
228+
227229
**装箱**:将基本类型用它们对应的引用类型包装起来;
228230

229231
**拆箱**:将包装类型转换为基本数据类型;
@@ -233,6 +235,7 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
233235
由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
234236

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

238241
## 16. import java和javax有什么区别?
@@ -244,10 +247,10 @@ Java 程序在执行子类的构造方法之前,如果没有用 super() 来调
244247
## 17. 接口和抽象类的区别是什么?
245248

246249
1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
247-
2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定。
248-
3. 一个类可以实现多个接口,但最多只能实现一个抽象类
249-
4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定。
250-
5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象。从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
250+
2. 接口中除了staticfinal变量,不能有其他变量,而抽象类中则不一定。
251+
3. 一个类可以实现多个接口,但只能实现一个抽象类。接口自己本身可以通过extends关键字扩展多个接口
252+
4. 接口方法默认修饰符是public,抽象方法可以有publicprotected和default这些修饰符(抽象方法就是为了被重写所以不能使用private关键字修饰!)。
253+
5. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
251254

252255
备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错。(详见issue:[https://github.com/Snailclimb/JavaGuide/issues/146](https://github.com/Snailclimb/JavaGuide/issues/146))
253256

@@ -322,11 +325,10 @@ public class test1 {
322325
```
323326

324327
**说明:**
328+
325329
- String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
326330
- 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
327331

328-
329-
330332
## 27. hashCode 与 equals (重要)
331333

332334
面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?”

0 commit comments

Comments
 (0)