DESKTOP-5NB63LS_20200908-潘振林md

问题

执行 Base b = new Sub();时由于多态 b编译时表现为Base类特性,运行时表现为Sub类特性,Base b = new Sub();不管是哪种状态都会调用Base构造器执行 callName()方法;执行方法时,由于多台表现为子类特性,所以会先在子类是否有 callName();而此时子类尚未初始化(执行完父类构造器后才会开始执行子类),如果有就执行,没有再去父类寻找

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();
    }
}

心得

想睡觉,这天气好困啊!