Niezainicjowany obiekt a obiekt zainicjowany do wartości NULL

93

Pracuję w Javie.

Często ustawiam niektóre obiekty jako takie:

public class Foo {
    private SomeObject someName;

    // do stuff

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

Pytanie brzmi: czy someNamew tym przykładzie jest to równoznaczne z tym null, że mogę reliably for all objectszałożyć, że niezainicjowane obiekty sprawdzające wartość null będą dokładne?

SnakeDoc
źródło

Odpowiedzi:

115

Prawidłowo, zarówno statyczne, jak i składowe wystąpienia typu referencyjnego, które nie zostały jawnie zainicjowane, są ustawiane nullprzez język Java. Ta sama zasada dotyczy elementów tablicy.

Ze specyfikacji języka Java , sekcja 4.12.5:

Początkowe wartości zmiennych

Każda zmienna w programie musi mieć wartość, zanim zostanie użyta:

Każda zmienna klasy, zmienna wystąpienia lub składnik tablicy jest inicjowana z wartością domyślną podczas tworzenia

[...] Dla wszystkich typów odwołań domyślną wartością jest null.

Zauważ, że powyższa reguła wyklucza zmienne lokalne: muszą one zostać zainicjowane jawnie, w przeciwnym razie program się nie skompiluje.

Sergey Kalinichenko
źródło
jak to się ma na przykład do char? Mogę to zrobić, char test;ale niechar test = null;
xorinzor
1
@xorinzor Nie możesz przypisać nulldo, charponieważ jest to typ pierwotny. Nie można również wykonać char test;wewnątrz metody bez testpóźniejszego przypisania . Możesz to zrobić, char test='a'jeśli chcesz, lub pozostawić to tak, jak char test;w deklaracji członka, aby uzyskać domyślną wartość '\0'.
Sergey Kalinichenko
14

Jeśli Objectodwołanie zostało zadeklarowane, ale nie zostało utworzone , jego wartością jest null.

Jared Nielsen
źródło
8
Tylko jako pole instancji klasy.
Sotirios Delimanolis
1
@SotiriosDelimanolis Czy możesz coś rozwinąć? Próbuję się nauczyć :)
SnakeDoc
5
@SnakeDoc Jeśli zadeklarujesz obiekt w treści metody, otrzymasz błąd kompilacji, jeśli spróbujesz go użyć bez wcześniejszej inicjalizacji.
Sotirios Delimanolis
9
Warto tutaj być precyzyjnym - nigdy nie deklarujesz przedmiotu. Deklarujesz zmienną . To nie to samo.
Jon Skeet
7
@SotiriosDelimanolis przepraszam, że wywołałem naprawdę starą dyskusję, ale czy zdarzyło Ci się, że masz odniesienie do tego , dlaczego zdecydowali, że powinno to spowodować błąd kompilacji, zamiast po prostu inicjować je nulltak, aby polubiły pole instancji?
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
źródło