下面的代码的执行结果打印什么?
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();
}
}
打印null
执行new Sub()的时候的流程:
会先执行本类的构造方法,本类的构造方法没写,就会执行默认的无参构造方法。
无参构造方法的默认的第一行的super()会自动调用父类的构造方法
父类的构造方法里会调用callName()方法
Base b = new Sub();是多态调用,所以会调用子类中重写的callName()方法
但是子类中的实例变量baseName还没有被初始化,因为子类的构造方法还没有执行完
最后打印的是null
即使 callName() 是在父类构造方法中被调用的,它仍然会执行子类 Sub 的实现。
这是Java多态(动态绑定)的特性。