不要在父类的构造方法(代码块)里面调用可以被子类重写的方法
我们从第一天学习Java开始,就对Java的类初始化顺序牢记于心。但是在实际开发过程中,似乎很难能接触这一部分的应用。在这之前,我也认为它只是面试中八股文而已,直到最近踩了一个坑,这才发现它是多么的重要。
1. 说说坑?
地球人都知道,在Java世界中,类初始化顺序是:
- 父类的 静态成员变量 或者 静态代码块 --> 子类的 静态成员变量 或者 静态代码块 -->
- 父类 成员变量 或者 普通代码块 --> 父类的 构造方法 --> 子类 成员变量 或者 普通代码块 --> 子类的 构造方法。
我们在理解上都没有问题,但是使用上很容易忽略这个顺序。我举一个例子:假设有两个类,分别是Animal
和Dog
类,其中Dog
继承于Animal
(是不是感觉回到了学习Java的第一天?)。它们的代码如下:
public class Animal {
public Animal() {
eat();
}
protected void eat() {
}
}
// ----------------------------
public class