成员变量的初始化时机
执行下面这段 Java 代码,它的输出结果为:调用子类的 addAge(), age=1
public class ClassInit {
public static void main(String[] args) {
Son son = new Son();
}
}
class Father {
private int age = 30;
public Father() {
this.addAge();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void addAge() {
this.age++;
System.out.println("调用父类的 addAge(), age=" + this.age);
}
}
class Son extends Father {
private int age = 8;
public Son() {
super();
}
@Override
public int getAge() {
return age;
}
@Override
public void setAge(int age) {
this.age = age;
}
public void addAge() {
this.age++;
System.out.println("调用子类的 addAge(), age=" + this.age);
}
}
原因分析:
- 首先在 main 方法中新建了一个 Son 对象, 此时应该调用 Son 的构造方法, 但是由于 Son 存在父类, 所以先执行父类的构造方法
- 在调用父类 Father 的构造方法时, 子类 Son 的成员变量还未进行初始化, 此时 son.age = 0, father.age = 30
- 又因为 Son 中重写了 Father 的 addAge 方法, 所以此时在 Father 的构造函数中调用的 addAge 方法是子类的实现
- 因此,输出结果为:
调用子类的 addAge(), age=1
而不是调用子类的 addAge(), age=9
总结: 成员变量在构造函数之后初始化。