当在父类构造数中调用子类重写过的方法时,到底会调用父类的方法呢还是子类的方法呢?
public class Super {
public Super(){
this.m();
}
public void m(){}
}
public class Sub extends Super{
private final Date date;
Sub(){
date=new Date();
}
@Override
public void m(){
System.out.println(date);
}
public static void main(String[] a){
Super s=new Sub();
s.m();
}
}
运行一下:
null
Fri May 25 23:54:28 CST 2018
Process finished with exit code 0
可以看出输出了又两行。所以当子类实例化时调用父类的构造函数中含有子类重写过的方法时候依然会调用子类的方法而不会调用父类的方法。
在这里第一行之所以打印NULL,是因为当调用父类构造函数时子类中的date对象并没有被实例化。
代码出自《Effective Java》书的第69页,第80个例子。