Oggetto non inizializzato vs oggetto inizializzato su NULL


93

Sto lavorando in Java.

Di solito ho impostato alcuni oggetti come tali:

public class Foo {
    private SomeObject someName;

    // do stuff

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

La domanda è: someNamein questo esempio è uguale a null, poiché posso reliably for all objectspresumere che gli oggetti non inizializzati con controllo null saranno accurati?

Risposte:


115

Corretto, sia i membri statici che quelli di istanza del tipo di riferimento non inizializzati in modo esplicito sono impostati nullda Java. La stessa regola si applica ai membri dell'array.

Dalle specifiche del linguaggio Java , sezione 4.12.5:

Valori iniziali delle variabili

Ogni variabile in un programma deve avere un valore prima che il suo valore venga utilizzato:

Ogni variabile di classe, variabile di istanza o componente di matrice viene inizializzata con un valore predefinito quando viene creata

[...] Per tutti i tipi di riferimento, il valore predefinito è null.

Si noti che la regola precedente esclude le variabili locali: devono essere inizializzate esplicitamente, altrimenti il ​​programma non verrà compilato.


come si applica, ad esempio, a char? Posso farlo char test;ma nonchar test = null;
xorinzor

1
@xorinzor Non puoi assegnare nulla charperché è un tipo primitivo. Inoltre non puoi fare char test;all'interno di un metodo senza assegnare in testseguito. Puoi farlo char test='a'se vuoi, o lasciarlo come char test;in una dichiarazione di membro per ottenere il valore predefinito di '\0'.
dasblinkenlight

14

Se un Objectriferimento è stato dichiarato ma non istanziato, il suo valore è null.


8
Solo come campo di istanza di una classe.
Sotirios Delimanolis

1
@SotiriosDelimanolis puoi approfondire per favore? Sto cercando di imparare :)
SnakeDoc

5
@SnakeDoc Se dichiari un oggetto nel corpo di un metodo, otterrai un errore di compilazione se provi ad usarlo senza prima inizializzarlo.
Sotirios Delimanolis

9
Vale la pena essere precisi qui: non dichiari mai un oggetto. Dichiari una variabile . Non sono la stessa cosa.
Jon Skeet

7
@SotiriosDelimanolis mi dispiace per aver sollevato una discussione molto vecchia, ma ti capita di avere un riferimento al motivo per cui hanno deciso che dovrebbe causare un errore di compilazione, piuttosto che inizializzarlo semplicemente nullcome un campo di istanza?
bambino del

-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");
              }   
            }
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.