Java流控制

标签 java control-flow

谁能解释为什么这段代码的输出为空?当我尝试调用 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() ), printDateA被调用,它打印出 d A 的变量,它是在 A 的构造函数之前初始化的被处决。

如果不清楚,B.d 不会覆盖 A.d,它只是隐藏了它。只能覆盖方法。

关于Java流控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013705/

相关文章:

java - JPA 和 EJB 延迟初始化字段

java - "Unresolved requirement: Import-Package: javax.ws.rs"在 Tomcat 上为 Liferay 部署 OSGi 模块时

java - 使用 Runnable 在 Java 中实现回调

c++ - 处理永远不会输入的 switch 情况的最合适方法是什么?

swift - swift函数中的嵌套if语句

objective-c - 是否有 "processing messages"的功能,即更新屏幕,响应累积的用户输入

asynchronous - node.js 的最佳控制流模块是什么?

java - 在 Java 中将 MemoryFileSystem 链接到普通文件系统

java - 使用注解来调用函数

asp.net-mvc - MVC中的执行流程