Java Inizializza un array int in un costruttore


90

Ho una classe e in quella classe ho questo:

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

Quindi nel mio costruttore:

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

Se lo faccio, va tutto bene. I valori dei dati predefiniti vengono inizializzati ma se invece faccio questo:

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

Dice:

Local variable hides a field

Perché?

Qual è il modo migliore per inizializzare un array all'interno del costruttore?


Spero che tu sia a conoscenza del concetto di ambito di variabile? la tua variabile datadopo "//some code"sta avendo un ambito dell'intera classe. mentre la variabile datanel costruttore ha uno scope all'interno del costruttore. e una volta che il costruttore è fatto, la variabile verrà distrutta. E anche la datavariabile all'interno del costruttore nasconde la variabile con lo stesso nome nella classe. Questo giustifica l'erroreLocal variable hides a field
Naveen Babu

Risposte:


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

Questo inizializza già gli elementi dell'array a 0. Non è necessario ripeterlo nuovamente nel costruttore.

Nel tuo costruttore dovrebbe essere:

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

Sì. Questo era l'unico modo che mi ha permesso. Mettere solo dati; ha detto che "non è un'affermazione". Grazie
Favolas

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

7

Puoi fare o:

public class Data {
    private int[] data;

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

Che si inizializza datanel costruttore o:

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

    public Data() {
        // data already initialised
    }
}

Che si inizializza dataprima che il codice nel costruttore venga eseguito.


Devo mettere data = new int [] {0,0,0}; all'interno del costruttore. Se inizializzo prima del codice nel costruttore inserendo solo dati; all'interno del costruttore mi ha dato l'errore "non un'istruzione"
Favolas

se ci sono più di milioni di elementi nell'array .. vorresti usare il primo codice e cambiare la riga public Data() throws Error {se OutOfMemoryErrorverrà lanciata.
nick

4

Questo perché, nel costruttore, hai dichiarato una variabile locale con lo stesso nome di un attributo.

Per allocare un array intero in cui tutti gli elementi sono inizializzati a zero, scrivi questo nel costruttore:

data = new int[3];

Per allocare un array intero che ha altri valori iniziali, inserisci questo codice nel costruttore:

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

o:

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

4

perché non semplicemente

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

il motivo per cui hai ricevuto l'errore è perché int[] data = ... dichiara una nuova variabile e nasconde il campodata

tuttavia va notato che il contenuto dell'array è già inizializzato a 0 (il valore predefinito di int)


1

nel tuo costruttore stai creando un altro array int:

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

Prova questo:

 data = {0,0,0};

NOTA: tra l'altro NON è necessario inizializzare gli elementi dell'array se è dichiarato come variabile di istanza. Le variabili di istanza ottengono automaticamente i valori predefiniti, che per un array di numeri interi, i valori predefiniti sono tutti zeri.

Se avessi un array dichiarato localmente, dovresti inizializzare ogni elemento.


0

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

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.