2012-11-03 4 views
7

default in un articolo su come gli oggetti vengono inizializzati in Java c'era un paragrafo che riportiamo qui di seguito:Perché è necessario che le variabili devono essere inizializzate ai valori in Java

Agli inizi della vita di un oggetto, la Java virtual machine (JVM) alloca memoria sufficiente sull'heap per adattare le variabili di istanza dell'oggetto. Tuttavia, quando viene allocata per la prima volta la memoria, i dati che contiene sono imprevedibili. Se la memoria fosse usata così com'è, anche il comportamento dell'oggetto sarebbe imprevedibile. Per evitare lo scenario , Java si assicura che la memoria sia inizializzata, a almeno con valori predefiniti prevedibili, prima che venga utilizzata da qualsiasi codice.

Qualcuno può gentilmente spiegare che cosa si intende per unpredictable data e unpredictable behavior qui. Grazie in anticipo

risposta

5

Qualcuno può gentilmente spiegare che cosa si intende per dati imprevedibili e comportamenti imprevedibili qui.

Se programmato in C/C++, si nota che una variabile non inizializzata comporta qualche valore spazzatura, presente nella locazione della memoria allocata ad esso, interpretati secondo il tipo di dati della variabile. Il compilatore non si lamenta di tali variabili e se lo sviluppatore si dimentica di inizializzarle correttamente, vengono utilizzati i valori di garbage, con conseguente comportamento imprevisto del programma.

In Java, la JVM inizializza tutte le variabili membro sui valori predefiniti in base al tipo di dati della variabile e si lamenta delle variabili locali non inizializzate durante la compilazione, per evitare comportamenti imprevisti e fare in modo che lo sviluppatore utilizzi sempre variabili inizializzate .

4

Perché se non si inizializza la variabile, JVM non capirà cosa assegnare e prenderà qualsiasi valore che risulterà in dati imprevedibili.

Il compilatore non assegna mai un valore predefinito a una variabile locale non inizializzata.

Da Wikipedia:

Java non variabili non inizializzate. I campi di classi e oggetti che non hanno un inizializzatore esplicito e gli elementi degli array vengono automaticamente inizializzati con il valore predefinito per il loro tipo (false per booleano, 0 per tutti i tipi numerici, null per tutti i tipi di riferimento). Le variabili locali in Java devono essere definitivamente assegnato a prima che si acceda, o si tratta di un errore di compilazione.

4

Questa imprevedibilità può essere sperimentata in C o C++ dove la lingua non inizializza automaticamente le variabili. Ecco un esempio da wikipedia:

void count(void) 
{ 
    int k, i; 
    for (i = 0; i < 10; i++) 
    { 
     k = k + 1; 
    } 
    printf("%d", k); 
} 

http://en.wikipedia.org/wiki/Uninitialized_variable

Non sappiamo k perché non sappiamo che valore ha tenuto inizialmente. Il valore iniziale è qualunque sia già contenuto nell'assegnazione del blocco di memoria: 0x0A4C1330 o 0x00000000 o 0x00FF3333, ecc.Di conseguenza, i rendimenti dei dati imprevedibili (tutti i tipi di) comportamento imprevedibile.

4

In C e altri linguaggi compilati in codice nativo e in esecuzione in ambiente non controllato, la variabile non inizializzata può contenere qualsiasi valore casuale. Questo è esattamente il termine "non prevedibile". Pensa al puntatore che punta in qualche posizione sconosciuta nella memoria. Se il tuo programma inizia a usare questo puntatore per errore si comporta almeno in modo imprevedibile se questo valore viene usato per la lettura, potrebbe bloccarsi perché per esempio la trasmissione del valore situato in quella cella di memoria casuale non può essere castata per scrivere nel codice o causare corruzione del sistema se un programma scrive informazioni nella regione di memoria appartiene a un altro programma.