今天在博客上看见一道多态的执行顺序题,如下
然而运行后结果却是:
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied
也就是说,在执行父类构造方法的时候,已经执行子类重写后的方法了。
根据我的理解,应该是运行时绑定在作祟,当子类新建对象时,父类调用被子类重写过的方法,那么编译器就会判定,应该将该方法编译为子类重写的方法。
我想了好久,除了这个解释应该没别的原因,如果我错了,请私信我。
啊,本来每天11.30准时睡觉的,为了解决这个问题拖了一小时还没洗澡.....不过蛮开心的,碎觉。
public class Dervied extends Base {
private String name = "dervied";
public Dervied() {
tellName();
printName();
}
public void tellName() {
System.out.println("Dervied tell name: " + name);
}
public void printName() {
System.out.println("Dervied print name: " + name);
}
public static void main(String[] args){
new Dervied();
}
}
class Base {
private String name = "base";
public Base() {
tellName();
printName();
}
public void tellName() {
System.out.println("Base tell name: " + name);
}
public void printName() {
System.out.println("Base print name: " + name);
}
}
我原本以为答案是这样的:
Base tell name: null
Base print name: null
Dervied tell name: dervied
Dervied print name: dervied
然而运行后结果却是:
Dervied tell name: null
Dervied print name: null
Dervied tell name: dervied
Dervied print name: dervied
也就是说,在执行父类构造方法的时候,已经执行子类重写后的方法了。
根据我的理解,应该是运行时绑定在作祟,当子类新建对象时,父类调用被子类重写过的方法,那么编译器就会判定,应该将该方法编译为子类重写的方法。
我想了好久,除了这个解释应该没别的原因,如果我错了,请私信我。
啊,本来每天11.30准时睡觉的,为了解决这个问题拖了一小时还没洗澡.....不过蛮开心的,碎觉。