谁能解释为什么这段代码的输出为空?当我尝试调用 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();
}
}
最佳答案
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,它只是隐藏了它。只能覆盖方法。
关于Java流控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013705/