Java 未初始化对象与初始化为空的对象

Java 未初始化对象与初始化为空的对象,java,null,initialization,Java,Null,Initialization,我在Java工作 我通常将一些对象设置为: public class Foo { private SomeObject someName; // do stuff public void someMethod() { if (this.someName != null) { // do some stuff } } } 问题是:本例中的someName是否等同于null,就像我可以可靠地检查所有对象一样

我在Java工作

我通常将一些对象设置为:

public class Foo {
    private SomeObject someName;

    // do stuff

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

问题是:本例中的
someName
是否等同于
null
,就像我可以
可靠地检查所有对象一样
假设null检查未初始化的对象是准确的?

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

根据第4.12.5节:

变量的初始值

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

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

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

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");
              }   
            }
        }

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

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

仅作为类的实例字段。@SotiriosDelimanolis您能详细说明一下吗?我正在努力学习:)@SnakeDoc如果你在方法体中声明一个对象,如果你在没有初始化它的情况下尝试使用它,你会得到一个编译错误。这里值得一提的是,你从来没有声明过一个对象。您声明了一个变量。它们不是同一件事。@SotiriosDelimanolis很抱歉提出了一个非常古老的讨论,但是您是否碰巧有一个参考,说明为什么他们认为它应该导致编译错误,而不是像实例字段一样将其初始化为
null
?这如何应用于例如
char
?我可以做
char测试但不<代码>字符测试=空
@xorinzor您不能将
null
分配给
char
,因为它是一种基本类型。你也不能做
char测试在方法内部,不分配
测试
。如果需要,您可以执行
char test='a'
,或者将其保留为
char test,以获取默认值
'\0'
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");
              }   
            }
        }