Javaで初期化されていないオブジェクト変数とnullに初期化されたオブジェクト変数の違いは何ですか


12

次の2つのオブジェクト変数があります

Date a;
Date b=null;

確かに、「a」と「b」の両方がオブジェクトを参照していません。

次のステートメントを呼び出すと

System.out.println(a.toString());

コンパイル時エラーが発生しますが、次のステートメントを呼び出すと

System.out.println(b.toString());

コンパイル時エラーは発生しませんが、実行時エラーは発生します。この理由と、null値を表すために「b」に実際に格納される値は何ですか?


2
SOで何度も質問と回答:ローカル変数がJavaで初期化されないのはなぜですか?Javaで初期化されていない変数とメンバーとこれらにリンクされている多くの質問で
GNAT

@gnat、他の質問は「初期化されていない」と「null」の違いを扱っていますか?答えが似ているからといって、これが重複した質問であることを意味するわけではありません。
ダグ

@DougM確かに、私が紹介した最初の質問を読みましたか?「Javaの設計者がローカル変数にデフォルト値を与えてはならないと感じた理由はありましたか?真剣に、インスタンス変数にデフォルト値を与えることができるなら、なぜローカル変数にも同じことができないのですか?」(FWIW 技術的に重複することはできません。単に別のサイトにあるからです)
gnat 14年

1
それは「初期化されていない」と「NULLとして初期化された」の違いに対処せず、「変数が自動的にNULLに初期化されないのはなぜですか?」同じトピック、わずかに異なる質問。
ダグ14年

回答:


3

これは、ローカル変数の状態がそのスコープ内で制御されるためです

 // method/loop/if/try-catch etc...
 {
   Date d; // if it's not intialised in this scope then its not intialised  anywhere
 }

フィールドの場合はそうではありません

class Foo{
 Date d; // it could be intialised anywhere, so its out of control and java will set to null for you
}

さて、なぜ変数をnullに設定してすぐに使用するのがいいのでしょうか?たぶんそれは歴史的な間違いであり、時には恐ろしい間違いにつながります

 {
  Date d = null;
  try{
  }catch{ // hide it here 
  }
  return d;
 } 

では、セマンティックの違いは何ですか?

Date d;

Dateただし、typeのオブジェクトを指す参照を保持できる変数を宣言するだけです

Date d= null; 

まったく同じことを行いますが、参照は今回はnullを指します。nullは参照のように、ネイティブポインタのスペースを取ります。32ビットマシンでは4バイト、64ビットマシンでは8バイトです


これは単に繰り返しポイントが作られ、中で説明しているようだ前に解答時間前に投稿
ブヨ

@gnatあなたのコメントをありがとう、しかし、私はそうではないと思います、乾杯
Sleiman Jneidi 14年

nullはメモリのどこかに格納されているオブジェクトでもあり、nullが割り当てられたすべてのオブジェクト変数はそのnullオブジェクトを指しているということですか?
Harish_N 14年

@ Harish.Nいいえ、私はそれを言わなかった、私は、その参照していないオブジェクトと
Sleiman Jneidi

例では、 'd'が参照です。これは、Date型のオブジェクトへの参照です。nullが参照の場合も同様です。それが参照するオブジェクトへの参照..?
Harish_N 14年

19

クラスフィールドに違いはありません。彼らはnull、オブジェクトのデフォルトでの数値のためと0 falseブールのために。

メソッドで宣言された変数の場合-Javaでは初期化する必要があります。それらを初期化しないと、アクセス時にコンパイルエラーが発生します。

どういう理由ですか?クラスフィールドは、任意のメソッドで変更できます。メソッドは任意の順序で呼び出されます。すべての非プライベートフィールドは、他のクラスやそのクラスを拡張するクラスによって変更される場合があります。したがって、多くの多くの場所で変数が割り当てられる可能性があるため、初期化されていない変数について通知しても意味がありません。

ただし、メソッド内の変数はローカルであり、メソッド自体の内部でのみ変更できます。したがって、起こりうる間違いを指摘することは可能かつ合理的です。そして、コンパイラはそれを試みます。フィールドが初期化されていないことがわかっいる場合、エラーが表示されます。不明な場合は、警告が表示されるため、確認できます。

public static class Test {
    Date a; // ok 
    Date b = null; // ok

    public void test() {
        Date c;
        Date d = null;

        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString()); // error
        System.out.println(d.toString()); // warning
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.