public class Base { private String baseName = "base"; public Base() { callName(); } private 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(); b.callName(); } }
输出:
base
base
谁能教教我,为什么这里输出的是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(); b.callName(); } }
输出:
null
sub
因为:父类构造器中调用了子类重写的callName方法。而此时,子类构造方法还没有执行,因此,baseName初始化为null。等子类构造器执行完后,则,调用子类重写的方法,所以,输出sub。