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?

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.


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.


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");
              }   
            }
        }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.