Java inicializa um array int em um construtor

90

Eu tenho uma aula e nessa aula eu tenho isso:

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

Então, no meu construtor:

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

Se eu fizer isso, tudo ficará bem. Os valores de dados padrão são inicializados, mas se eu fizer isso:

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

Diz:

Local variable hides a field

Por quê?

Qual é a melhor maneira de inicializar um array dentro do construtor?

Favolas
fonte
Espero que você esteja ciente do conceito de escopo de variável. sua variável datadepois de "//some code"ter um escopo de toda a classe. enquanto a variável datano construtor tem um escopo dentro do construtor. e assim que o construtor estiver pronto, a variável será destruída. E também a datavariável dentro do construtor oculta a variável com o mesmo nome na classe. Isso justifica o erroLocal variable hides a field
Naveen Babu

Respostas:

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

Isso já inicializa seus elementos de array para 0. Você não precisa repetir isso novamente no construtor.

Em seu construtor, deve ser:

data = new int[]{0, 0, 0};
Bhesh Gurung
fonte
Sim. Esta foi a única maneira que me permitiu. Colocando apenas dados; disse que "não é uma declaração". Obrigado
Favolas
Ele não pode usar data=new int[3]no construtor padrão Date()?
parsecer
7

Você pode fazer:

public class Data {
    private int[] data;

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

Que inicializa datano construtor ou:

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

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

Que inicializa dataantes que o código no construtor seja executado.

Pillingworth
fonte
Tenho que colocar data = new int [] {0,0,0}; dentro do construtor. Se eu inicializar antes do código no construtor colocando apenas dados; dentro do construtor deu-me o erro "não é uma declaração"
Favolas
se houver mais de um milhão de elementos na matriz ... você gostaria de usar o primeiro código e alterar a linha public Data() throws Error {se OutOfMemoryErrorela for lançada.
nick
4

Isso ocorre porque, no construtor, você declarou uma variável local com o mesmo nome de um atributo.

Para alocar uma matriz inteira na qual todos os elementos são inicializados com zero, escreva no construtor:

data = new int[3];

Para alocar uma matriz inteira que possui outros valores iniciais, coloque este código no construtor:

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

ou:

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

porque não simplesmente

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

o motivo pelo qual você obteve o erro é porque int[] data = ...declara uma nova variável e oculta o campodata

no entanto, deve-se observar que o conteúdo da matriz já foi inicializado com 0 (o valor padrão de int)

aberração da catraca
fonte
1

em seu construtor, você está criando outra matriz int:

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

Experimente isto:

 data = {0,0,0};

NOTA: A propósito, você NÃO precisa inicializar os elementos do array se ele for declarado como uma variável de instância. Variáveis ​​de instância obtêm automaticamente seus valores padrão, que para uma matriz de inteiros, os valores padrão são todos zeros.

Se você tivesse um array declarado localmente, porém, você precisaria inicializar cada elemento.

Mechkov
fonte
0

A melhor maneira é não escrever nenhuma instrução de inicialização. Isso ocorre porque se você escrever int a[]=new int[3]então, por padrão, em Java todos os valores de array a[0], ou seja , a[1]e a[2]são inicializados para 0! Com relação à variável local que esconde um campo, poste seu código inteiro para que possamos concluir.

Kameron
fonte