未初始化的对象vs初始化为NULL的对象


93

我在用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假定对未初始化的对象进行空检查将是准确的?

Answers:


115

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

根据Java语言规范的第4.12.5节:

变量的初始值

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

每个类变量,实例变量或数组组件在创建时均使用默认值初始化

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

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


例如,这如何适用char?我可以char test;但是不能char test = null;
xorinzor 17/09/26

1
@xorinzor您无法分配nullchar它,因为它是原始类型。同样,如果不稍后char test;分配,您将无法在方法内部test进行操作。您可以char test='a'根据需要进行操作,也可以将其保留char test;在成员声明中以获取默认值'\0'
dasblinkenlight

14

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


8
仅作为类的实例字段。
Sotirios Delimanolis 2013年

1
@SotiriosDelimanolis您能详细说明吗?我正在尝试学习:)
SnakeDoc

5
@SnakeDoc如果在方法主体中声明对象,则尝试使用该对象而不先对其进行初始化将收到编译错误。
Sotirios Delimanolis

9
在这里值得一提的是-您永远不会声明对象。您声明一个变量。他们不是一回事。
乔恩·斯基特

7
@SotiriosDelimanol很抱歉提出了一个非常古老的讨论,但是您碰巧参考了为什么他们认为应该导致编译错误,而不是仅仅将其初始化为null实例字段吗?
childofsoong's

-1
namespace Design
     {
              class Program
              {

                static void Main(string[] args)
                {
                  Logger obj1;   // By Default, the value of obj1 is null
                  Logger obj2 = new Logger();  // By Default the value of obj2 is 
                                               // Design.Logger which is not null
                  Console.WriteLine(obj2); 
                  Console.Read();
                }
              }

     class Logger
           {
             public Logger()
              {
                 Console.writeline("Called");
              }   
            }
        }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.