Qual è la differenza tra la variabile oggetto non inizializzata e la variabile oggetto inizializzata su null in Java

10

Ho le seguenti due variabili oggetto

Date a;
Date b=null;

Sicuramente sia 'a' che 'b' non si riferiscono a nessun oggetto.

Ora se invoco la seguente istruzione

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

Ci sarà un errore in fase di compilazione, mentre se invoco la seguente istruzione

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

Non ci sarà nessun errore in fase di compilazione ma ci sarà un errore di runtime. Qual è la ragione di ciò e quale valore verrà effettivamente memorizzato in "b" per rappresentare un valore nullo?

    
posta Harish_N 02.10.2014 - 15:34
fonte

2 risposte

3

Questo è perché lo stato delle variabili locali è controllato nel suo ambito

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

Che non è il caso per i campi

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

Ora, perché è bene impostare una variabile su null e usarla immediatamente? forse questo è un errore storico che a volte porta a errori orribili

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

Ora qual è la differenza semantica?

Date d;

dichiara semplicemente una variabile che può contenere un riferimento che punta a un oggetto di tipo Date , tuttavia

Date d= null; 

fa esattamente la stessa cosa ma il riferimento punta nullo questa volta, null è come qualsiasi riferimento, occupa uno spazio di un puntatore nativo, cioè 4 byte su macchine a 32 bit e 8 byte su macchine a 64 bit

    
risposta data 02.10.2014 - 17:08
fonte
14

Non c'è differenza per i campi di classe. Sono null di default per gli oggetti, 0 per i valori numerici e false per i booleani.

Per le variabili dichiarate nei metodi - Java richiede che siano inizializzate. Non inizializzarli causa un errore di compilazione quando sono accessibili.

Qual è la ragione? I campi di classe possono essere modificati con qualsiasi metodo. In qualsiasi ordine il metodo è invocato. Tutti i campi non privati possono essere modificati da altre classi e / o classi che estendono tale classe. Quindi, non ha senso notificare una variabile non inizializzata, dato che può essere assegnata in molti, molti posti.

Le variabili all'interno dei metodi, tuttavia, sono locali e possono essere modificate solo all'interno del metodo stesso. Quindi è sia possibile che razionale indicare possibili errori. E il compilatore cerca di farlo. Se conosce il campo non è inizializzato, mostrerà un errore, perché non è mai quello che vuoi. Se non è sicuro - darà un avvertimento, in modo che tu possa esserne sicuro.

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
    }
}
    
risposta data 02.10.2014 - 15:42
fonte

Leggi altre domande sui tag