web-dev-qa-db-ja.com

初期化されていないオブジェクトとNULLに初期化されたオブジェクト

私はJavaで働いています。

私は通常、いくつかのオブジェクトを次のようにセットアップします。

public class Foo {
    private SomeObject someName;

    // do stuff

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

質問は次のとおりです。この例のsomeNamenullと同等で、reliably for all objectsは初期化されていないオブジェクトのNULLチェックが正確であると想定できますか?

81
SnakeDoc

正しい、明示的に初期化されていない参照型の静的メンバーとインスタンスメンバーの両方が、Javaによってnullに設定されます。同じ規則が配列メンバーに適用されます。

Java言語仕様 のセクション4.12.5から:

変数の初期値

プログラム内のすべての変数は、値が使用される前に値を持っている必要があります。

各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます

[...]すべての参照タイプについて、デフォルト値はnullです。

上記のルールはローカル変数を除外することに注意してください。ローカル変数は明示的に初期化する必要があります。そうしないと、プログラムはコンパイルされません。

103
dasblinkenlight

Object参照が宣言されているがインスタンス化されていない場合、その値はnullです。

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