当在父类构造数中调用子类重写过的方法时

当在父类构造数中调用子类重写过的方法时,到底会调用父类的方法呢还是子类的方法呢?

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个例子。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容