概要
自从上次断网,几天没写博客,发现自己已经堆积了七篇没写了,感觉快要炸了。不管怎么样,今晚都要把第七章到第十四章的内容记载下来。本章主要讲了两个东西——继承和组合。并从代码设计学的角度讲了他们的优势和劣势。总的来说,就是劲量避免用继承,多用组合。以下是本章要点:
1.一个类总是会继承一个对象,如果我们不具体指明,那就是默认继承Object。
2.如果基类不存在一个不含任何参数的构造器,那么在子类构造器中,我们必须显示调用基类构造器。
3.什么是代理?代理就是通过另一个类代理执行某个类的方法。具体如下:
interface A{//首先我们创造一个接口
void display();
void show();
}
class RealClass implements A{//这是真实执行我们代理的类
void display(){
//doSomething();
}
void show(){
//doSomethingEles();
}
}
class ProxyClass implements A{//通过这个代理类,我们没有让我们的真实类A直接执行代码,而是在代理类的方法中调用A的代码。
A a;
ProxyClass(A a){
this.a = a;
}
void display(){
a.display();
}
void show(){
a.show();
}
}
4.清理一个类和初始化一个类相反:先清理子类,再清理基类。
5.一个类,如果要覆盖子类的方法,我们可以使用注解@Override,如果是重载,那么用了这个注解编译时不会通过的。
6.在继承一个类的时候,如果你像覆盖一个方法,你可以修改这个方法的限定符(private、public、protected),但是要注意的是,你只能缩小限定符的范围,不能扩大。比如父类是private的,而子类就不能是public。
7.我们向上转型一个类,让其变成基类引用。实际上我们调用的方法,还是父类的代码(这点很逗,很多次居然都没立马想到)。
8.记住一点设计模式是,如果不需要向上转型,那么就应该使用组合而不是继承。
9.一个static final修饰的基本类型,是在编译期就确定了的,能够在编译器直接参与运算。而修饰的对象,要在运行的时候才能分配内存。一个static final对象,其引用地址永远不能改变,但其对象内部的值是可以改变的。
10.我们可以申明一个类的fianl数据不初始化,但是在构造函数中,我们必须要初始化。
11.要想防止任何继承类修改父类方法的含义,可以使用fianl修饰这个方法。
12.事实上,private修饰的方法隐含存在final修饰,但是我们可以在子类中添加一个和private修饰的方法一模一样的方法。
13.如果一个类是final的,那么我们是不可以继承这个类的。
14.类的初始化顺序:基类静态变量->该类静态变量->基类变量初始化->基类构造函数运行->该类变量初始化->该类构造函数运行。