Nicht initialisiertes Objekt gegen auf NULL initialisiertes Objekt

92

Ich arbeite in Java.

Ich richte normalerweise einige Objekte als solche ein:

public class Foo {
    private SomeObject someName;

    // do stuff

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

Die Frage ist: Wird someNamein diesem Beispiel gleichgesetzt null, dass ich reliably for all objectsdavon ausgehen kann, dass die Nullprüfung nicht initialisierter Objekte korrekt ist?

SnakeDoc
quelle

Antworten:

113

Richtig, sowohl statische als auch Instanzmitglieder des Referenztyps, die nicht explizit initialisiert wurden, werden nullvon Java festgelegt. Die gleiche Regel gilt für Array-Mitglieder.

Aus der Java-Sprachspezifikation , Abschnitt 4.12.5:

Anfangswerte von Variablen

Jede Variable in einem Programm muss einen Wert haben, bevor ihr Wert verwendet wird:

Jede Klassenvariable, Instanzvariable oder Array-Komponente wird beim Erstellen mit einem Standardwert initialisiert

[...] Für alle Referenztypen ist der Standardwert null.

Beachten Sie, dass die obige Regel lokale Variablen ausschließt: Sie müssen explizit initialisiert werden, sonst wird das Programm nicht kompiliert.

dasblinkenlight
quelle
Wie trifft dies zum Beispiel zu char? Ich kann char test;aber nichtchar test = null;
Xorinzor
1
@xorinzor Sie können nicht zuweisen null, charda es sich um einen primitiven Typ handelt. Sie können dies auch nicht char test;innerhalb einer Methode tun , ohne sie testspäter zuzuweisen . Sie können dies tun, char test='a'wenn Sie möchten, oder es wie char test;in einer Mitgliedsdeklaration belassen, um den Standardwert von zu erhalten '\0'.
Dasblinkenlight
13

Wenn eine ObjectReferenz deklariert, aber nicht instanziiert wurde, lautet ihr Wert null.

Jared Nielsen
quelle
8
Nur als Instanzfeld einer Klasse.
Sotirios Delimanolis
1
@SotiriosDelimanolis können Sie bitte näher erläutern? Ich versuche zu lernen :)
SnakeDoc
5
@SnakeDoc Wenn Sie ein Objekt in einem Methodenkörper deklarieren, wird ein Kompilierungsfehler angezeigt, wenn Sie versuchen, es zu verwenden, ohne es zuvor zu initialisieren.
Sotirios Delimanolis
9
Hier lohnt es sich, genau zu sein - Sie deklarieren niemals ein Objekt. Sie deklarieren eine Variable . Sie sind nicht dasselbe.
Jon Skeet
7
@SotiriosDelimanolis tut mir leid, dass ich eine wirklich alte Diskussion angesprochen habe, aber haben Sie zufällig einen Hinweis darauf, warum sie entschieden haben, dass dies einen Kompilierungsfehler verursachen sollte, anstatt nur zu initialisieren, nulldass ein Instanzfeld gefällt?
childofsoong
-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");
              }   
            }
        }
Alexander Zaldostanov
quelle