谁能解释为什么这段代码将输出设为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(),后者打印dB变量的值。但是,dB变量尚未初始化(仅在执行A的构造函数后才会初始化)。因此,它仍然为null(这是参考变量的默认值)。

另一方面,当您创建A(new A())实例时,会调用printDateA,并打印dA变量,该变量在A的构造函数执行之前已初始化。

如果不清楚,B.d不会覆盖A.d,而是将其隐藏。只有方法可以被覆盖。

08-05 19:17