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


93

私はJavaで働いています。

私は一般的にいくつかのオブジェクトをそのように設定します:

public class Foo {
    private SomeObject someName;

    // do stuff

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

問題は次のとおりですsomeName。この例ではと同等ですがnullreliably for all objects初期化されていないオブジェクトのnullチェックは正確であると仮定できますか。

回答:


115

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

Java言語仕様、セクション4.12.5:

変数の初期値

プログラム内のすべての変数には、その値が使用される前に値が必要です。

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

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

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


これはどのように適用されcharますか?できますchar test;ができませんchar test = null;
xorinzor 2017

1
@xorinzorあなたは割り当てることができませんnullchar、それがプリミティブ型であるため。またchar test;test後で割り当てることなくメソッド内で行うことはできません。必要にchar test='a'応じて行うこともchar test;、メンバー宣言のままにしてデフォルト値のを取得することもできます'\0'
dasblinkenlight 2017

14

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


8
クラスのインスタンスフィールドとしてのみ。
Sotirios Delimanolis 2013年

1
@SotiriosDelimanolis詳細について教えてください。私は学ぼうとしています:)
SnakeDoc 2013年

5
@SnakeDocメソッド本体でオブジェクトを宣言している場合、最初に初期化せずに使用しようとすると、コンパイルエラーが発生します。
Sotirios Delimanolis 2013年

9
ここでは正確である必要があります。オブジェクトを宣言することはありません。変数を宣言します。それらは同じものではありません。
ジョンスキート

7
@SotiriosDelimanolisは本当に古いディスカッションを表示して申し訳ありませんが、インスタンスフィールドのように初期化するだけでなく、コンパイルエラーが発生すると判断された理由について、たまたま参照がありますかnull
childofsoong 2016

-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");
              }   
            }
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.