谁能解释为什么这段代码将输出设为null?当我尝试调用new A()
而不是new B()
时,它正在打印当前日期。
class A
{
Date d = new Date();
public A()
{
printDate();
}
void printDate()
{
System.out.println("parent");
System.out.println(d);
}
}
class B extends A
{
Date d = new Date();
public B()
{
super();
}
@Override
void printDate()
{
System.out.println("child");
System.out.println(d);
}
}
public class Test
{
public static void main(String[] args)
{
new B();
}
}
最佳答案
新的B()调用B的构造函数,后者又调用A的构造函数。A的构造函数调用printDate()
,由于该重写,它执行B的printDate()
,后者打印d
的B
变量的值。但是,d
的B
变量尚未初始化(仅在执行A的构造函数后才会初始化)。因此,它仍然为null(这是参考变量的默认值)。
另一方面,当您创建A
(new A()
)实例时,会调用printDate
的A
,并打印d
的A
变量,该变量在A
的构造函数执行之前已初始化。
如果不清楚,B.d不会覆盖A.d,而是将其隐藏。只有方法可以被覆盖。