auto commit
This commit is contained in:
parent
bae6152513
commit
ef7b05befc
|
@ -324,7 +324,7 @@ public class CloneExample {
|
|||
|
||||
```java
|
||||
CloneExample e1 = new CloneExample();
|
||||
CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object'
|
||||
// CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object'
|
||||
```
|
||||
|
||||
接下来覆盖 Object 的 clone() 得到以下实现:
|
||||
|
@ -510,7 +510,7 @@ protected 用于修饰成员,表示在继承体系中成员对于子类可见
|
|||
|
||||
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里式替换原则。
|
||||
|
||||
字段决不能是公有的,因为这么做的话就失去了对这个实例域修改行为的控制,客户端可以对其随意修改。可以使用共有的 getter 和 setter 方法来替换共有字段。
|
||||
字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。可以使用共有的 getter 和 setter 方法来替换共有字段。
|
||||
|
||||
```java
|
||||
public class AccessExample {
|
||||
|
@ -634,9 +634,9 @@ System.out.println(InterfaceExample.x);
|
|||
|
||||
**3. 比较**
|
||||
|
||||
- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求子类和父类具有 IS-A 关系;
|
||||
- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系。
|
||||
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
|
||||
- 接口的字段只能是 static 和 final 类型的,而抽象类的域可以有多种访问权限。
|
||||
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段可以有多种访问权限。
|
||||
- 接口的方法只能是 public 的,而抽象类的方法可以由多种访问权限。
|
||||
|
||||
**4. 使用选择**
|
||||
|
@ -652,7 +652,7 @@ System.out.println(InterfaceExample.x);
|
|||
- 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
|
||||
- 需要使用多重继承。
|
||||
|
||||
在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次接口要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
|
||||
在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
|
||||
|
||||
> [深入理解 abstract class 和 interface](https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/) </br> [When to Use Abstract Class and Interface](https://dzone.com/articles/when-to-use-abstract-class-and-intreface)
|
||||
|
||||
|
@ -773,7 +773,7 @@ String s5 = "bbb";
|
|||
System.out.println(s4 == s5); // true
|
||||
```
|
||||
|
||||
Java 虚拟机将堆划分成新生代、老年代和永久代(PermGen Space)。在 Java 7 之前,字符串常量池被放在永久代中,而在 Java 7,它被放在堆的其它位置。这是因为永久代的空间有限,如果大量使用字符串的场景下会导致 OutOfMemoryError 错误。
|
||||
Java 虚拟机将堆划分成新生代、老年代和永久代(PermGen Space)。在 Java 7 之前,字符串常量池被放在永久代中,而在 Java 7,它被放在堆的其它位置。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。
|
||||
|
||||
> [What is String interning?](https://stackoverflow.com/questions/10578984/what-is-string-interning) </br> [深入解析 String#intern](https://tech.meituan.com/in_depth_understanding_string_intern.html)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user