【问题标题】:Uninitialized Object vs Object Initialized to NULL未初始化的对象与初始化为 NULL 的对象
【发布时间】:2013-05-22 18:57:19
【问题描述】:

我正在使用 Java。

我通常这样设置一些对象:

public class Foo {
    private SomeObject someName;

    // do stuff

    public void someMethod() {
        if (this.someName != null) {
            // do some stuff
        }
    }
}

问题是:在这个例子中someName 是否等同于null,因为我可以reliably for all objects 假设对未初始化对象进行空值检查是准确的?

【问题讨论】:

    标签: java null initialization


    【解决方案1】:

    正确,未显式初始化的引用类型的静态成员和实例成员均由 Java 设置为 null。同样的规则也适用于数组成员。

    来自Java Language Specification,第 4.12.5 节:

    变量的初始值

    程序中的每个变量在使用它的值之前都必须有一个值:

    每个类变量、实例变量或数组组件都使用 创建时的默认值

    [...] 对于所有引用类型,默认值为null

    注意,以上规则不包括局部变量:它们必须显式初始化,否则程序将无法编译。

    【讨论】:

    • 这如何适用于例如char?我可以char test; 但不能char test = null;
    • @xorinzor 您不能将null 分配给char,因为它是原始类型。此外,如果不稍后分配 test,您也不能在方法内执行 char test;。您可以根据需要使用char test='a',或者在成员声明中将其保留为char test;,以获得默认值'\0'
    【解决方案2】:

    如果 Object 引用已声明但未实例化,则其值为 null

    【讨论】:

    • 只作为类的实例字段。
    • @SotiriosDelimanolis 你能详细说明一下吗?我正在努力学习:)
    • @SnakeDoc 如果你在方法体中声明一个对象,如果你在没有初始化的情况下尝试使用它,你会得到一个编译错误。
    • 这里值得精确 - 你永远不会声明一个对象。你声明了一个变量。它们不是一回事。
    • @SotiriosDelimanolis 很抱歉提出了一个非常古老的讨论,但是您是否碰巧有关于 为什么 他们认为它应该导致编译错误的参考,而不是仅仅使它像实例字段一样初始化为null
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    相关资源
    最近更新 更多