做题遇到这样一个题:
class Person {
public String name = "Person";
public Person() {
sayName();
}
public void sayName() {
System.out.println(name);
}
}
class Student extends Person {
public String name = "Student";
public void sayName() {
System.out.println(name);
}
}
class aaa {
public static void main(String[] args) {
new Student();
}
}
以为会调用自己的sayName
,从而输出Student
,实际上输出null
。
首先默认的午餐构造函数会调用父类的无参构造函数;
在父类的无参构造方法中,调用后为成员变量初始化,Person
的name
从null
变为Person
,最后调用sayName
方法;
由于子类自己已经复写了这个方法,那么就调用子类的自己的这个方法;
但是此时子类还没有对自己的name
字段进行初始化,故而输出的为null
;
调用完毕后,子类的name
字段初始化为Student
。
因为调用是从子类的构造->父类的构造,由父类的构造去调用子类的重写方法,那么调用的时候子类还没来得及对其成员变量name
进行初始化并赋予初值。