Inizializzazione varibili di istanza

di il
1 risposte

Inizializzazione varibili di istanza

Buongiorno,
sto facendo dei quiz con Enthuware per preparami alla certificazione JAVA OCA 7.

DOMANDA:
Which of the following statements can be inserted at // 1 to make the code compile without errors?

public class InitTest{
static int si = 10;
int i;
final boolean bool;
// 1
}

A. instance { bool = true; }
B. InitTest() { si += 10; }
C. { si = 5; i = bool ? 1000 : 2000;}
D. { i = 1000; }
E. { bool = (si > 5); i = 1000; }

La risposta giusta è la E. Invece io ho segnato la D. La correzione mi dice che la D non è corretta perchè la variabile bool rimane inizializzata. La mia domanda è: ma se non inizializzo una variabile di istanza essa non prende il valore di default? E poi: quindi è obbligatorio inizializzare tutte le variabili di istanza?

Grazie a chiunque mi aiuterà.

Saluti, Elias.

1 Risposte

  • Re: Inizializzazione varibili di istanza

    elias86 ha scritto:


    La risposta giusta è la E.

    elias86 ha scritto:


    ma se non inizializzo una variabile di istanza essa non prende il valore di default? E poi: quindi è obbligatorio inizializzare tutte le variabili di istanza?
    Una variabile di istanza, normalmente, è inizializzata automaticamente al suo valore di "default" (0 per i numerici/char, false per i boolean, null per i reference). Questo vale anche per le variabili "di classe" (static) nonché per gli elementi degli array creati con new Tipo[dim].

    Ma in quel codice, bool è final (e non essendo subito inizializzata, si dice che è un "blank final"). Una variabile di istanza final deve (ripeto, DEVE) essere inizializzata ENTRO la fine del costruttore. Quindi se non si inizializza subito nella dichiarazione, va fatta una assegnazione o nel costruttore o in un blocco di inizializzazione di istanza.

    Nota che A è sbagliata, non esiste una sintassi instance { }
    La D è comunque sbagliata perché assegna ad i (che non c'è alcun obbligo, però) mentre non assegna a bool (che invece sarebbe necessario). Cosa similare per B.
    La C è pure sbagliata, usa bool che non è inizializzato.


    P.S. per completezza, rimando alla documentazione ufficiale, il Java Language Specification 10, sezione 8.3.1.2. final Fields:

    A blank final instance variable must be definitely assigned and moreover not definitely unassigned at the end of every constructor of the class in which it is declared, or a compile-time error occurs
Devi accedere o registrarti per scrivere nel forum
1 risposte