多态机制的深入了解以及finally中涉及的小细节2

public class Base
{
    private String baseName = "base";
    public Base()
    {
        callName();
    }
 
    public void callName()
    {
        System. out. println(baseName);
    }
 
    static class Sub extends Base
    {
        private String baseName = "sub";
        public void callName()
        {
            System. out. println (baseName) ;
        }
    }
    public static void main(String[] args)
    {
        Base b = new Sub();
    }
}

在父类构造器中调用子类重写的方法,也就是构造器内部的多态方法行为,这里有一个很大的误区就是,大家会觉得输出"sub",其实这里输出的是null,为什么呢?原因就在于创建子类对象时先调用父类构造器创建父类对象,此时父类构造器又调用了子类重写的方法(动态绑定机制此时已经能够生效了),这个时候子类还没完全构建,但是Java在加载Sub时(这个在所有实例初始化之前),会将Sub中的属性全部置"0"(基本类型置为0,引用类型置为null),所以在Base构造器中调用callName方法,通过多态机制(调用Sub类的callName方法),输出null,所以在父类构造器调用private,final修饰的方法是最安全的

猜你喜欢

转载自blog.csdn.net/m0_38078065/article/details/86750228
今日推荐