2011-11-09 17 views
60

ho una classe e in quella classe ho questo:Java inizializzare un array int in un costruttore

//some code 
private int[] data = new int[3]; 
//some code 

Poi nel mio costruttore:

public Date(){ 
    data[0] = 0; 
    data[1] = 0; 
    data[2] = 0; 
} 

Se faccio questo, tutto è OK . i valori dei dati di default sono inizializzati ma se io invece faccio:

public Date(){ 
    int[] data = {0,0,0}; 
} 

Dice:

Local variable hides a field 

Perché?

Qual è il modo migliore per inizializzare una matrice all'interno del costruttore?

grazie

+0

spero che tu sia a conoscenza del concetto di portata delle variabili? la tua variabile 'data' dopo' "// some code" 'sta avendo un ambito dell'intera classe. mentre la variabile 'data' nel costruttore ha un ambito all'interno del costruttore. e una volta che il costruttore è finito, la variabile verrà distrutta. E anche la variabile 'data' all'interno del costruttore nasconde la variabile con lo stesso nome nella classe. Questo giustifica l'errore 'La variabile locale nasconde un campo' –

risposta

127
private int[] data = new int[3]; 

Questo inizializza già gli elementi dell'array su 0. Non è necessario ripeterlo di nuovo nel costruttore.

nel costruttore dovrebbe essere:

data = new int[]{0, 0, 0}; 
+0

Sì. Questo era l'unico modo che mi permetteva. Mettendo solo i dati; ha detto che "non è una dichiarazione". Grazie – Favolas

+0

Non può usare 'data = new int [3]' nel costruttore defualt 'Date()'? – parsecer

4

perché non semplicemente

public Date(){ 
    data = new int[]{0,0,0}; 
} 

la ragione che hai l'errore è dovuto al fatto int[] data = ... dichiara una nuova variabile e nasconde il campo data

tuttavia va notato che il contenuto del la matrice è già inizializzata su 0 (il valore predefinito di int)

0

nel costruttore si sta creando un altro int array:

public Date(){ 
    int[] data = {0,0,0}; 
    } 

Prova questo:

data = {0,0,0}; 

NOTA: A proposito NON è necessario inizializzare i tuoi elementi dell'array se viene dichiarato come una variabile di istanza . Le variabili di istanza ottengono automaticamente i loro valori predefiniti, che per un array intero, i valori predefiniti sono tutti zero.

Se la matrice dichiarata a livello locale era necessaria per inizializzare ogni elemento.

0

Il modo migliore è di non scrivere dichiarazioni di inizializzazione. Questo perché se scrivi int a[]=new int[3] allora, per impostazione predefinita, in Java tutti i valori dell'array, cioè a[0], a[1] e a[2] vengono inizializzati su 0! Per quanto riguarda la variabile locale che nasconde un campo, pubblica il tuo intero codice per arrivare alla conclusione.

6

Si potrebbe o fare

public class Data { 

    private int[] data; 

    public Data() { 

    data = new int[] { 0, 0, 0 }; 
    } 
} 

che inizializza data nel costruttore, o

public class Data { 

    private int[] data = new int[] {0,0,0}; 

    public Data() { 

    // data already initialised 
    } 

}

che inizializza data prima che venga eseguito il codice nel costruttore.

+0

Devo mettere data = new int [] {0,0,0}; all'interno del costruttore. Se inizializzo prima del codice nel costruttore mettendo solo i dati; all'interno del costruttore mi ha dato l'errore "not a statement" – Favolas

+0

se ci sono più di milioni di elementi in array .. si vorrebbe usare il primo codice e cambiare la riga 'public Data() genera Error {' se viene lanciato 'OutOfMemoryError'. –

4

Questo perché, nel costruttore, è stata dichiarata una variabile locale con lo stesso nome di un attributo.

Per assegnare un array intero che tutti gli elementi vengono inizializzati a zero, scrivere questo nel costruttore:

data = new int[3]; 

Per assegnare un array intero che ha altri valori iniziali, mettere questo codice nel costruttore:

int[] temp = {2, 3, 7}; 
data = temp; 

o:

data = new int[] {2, 3, 7}; 
Problemi correlati