Java inicializa una matriz int en un constructor

91

Tengo una clase y en esa clase tengo esto:

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

Luego en mi constructor:

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

Si hago esto, todo está bien. Los valores de datos predeterminados se inicializan, pero si en cambio hago esto:

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

Dice:

Local variable hides a field

¿Por qué?

¿Cuál es la mejor manera de inicializar una matriz dentro del constructor?

Favolas
fuente
Espero que conozcas el concepto de alcance de variable. su variable datadespués "//some code"tiene un alcance de toda la clase. mientras que la variable dataen el constructor tiene un alcance dentro del constructor. y una vez terminado el constructor, la variable será destruida. Y también la datavariable dentro del constructor oculta la variable con el mismo nombre en la clase. Esto justifica el errorLocal variable hides a field
Naveen Babu

Respuestas:

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

Esto ya inicializa los elementos de su matriz a 0. No necesita repetir eso nuevamente en el constructor.

En su constructor debería ser:

data = new int[]{0, 0, 0};
Bhesh Gurung
fuente
Si. Esta era la única forma en que me lo permitía. Poniendo solo datos; dijo que "no es una declaración". Gracias
Favolas
¿No puede usarlo data=new int[3]en el constructor defualt Date()?
parsecer
7

Puedes hacer:

public class Data {
    private int[] data;

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

Que se inicializa dataen el constructor, o:

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

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

Que se inicializa dataantes de que se ejecute el código en el constructor.

Pillingworth
fuente
Tengo que poner data = new int [] {0,0,0}; dentro del constructor. Si inicializo antes del código en el constructor poniendo solo datos; dentro del constructor me dio el error "no una declaración"
Favolas
si hay más de un millón de elementos en la matriz ... le gustaría usar el primer código y cambiar la línea public Data() throws Error {si se OutOfMemoryErrorlanzará.
nick
4

Esto se debe a que, en el constructor, declaró una variable local con el mismo nombre que un atributo.

Para asignar una matriz de enteros en la que todos los elementos se inicializan a cero, escriba esto en el constructor:

data = new int[3];

Para asignar una matriz de enteros que tiene otros valores iniciales, coloque este código en el constructor:

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

o:

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

por qué no simplemente

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

la razón por la que obtuvo el error es porque int[] data = ...declara una nueva variable y oculta el campodata

sin embargo, debe tenerse en cuenta que el contenido de la matriz ya está inicializado en 0 (el valor predeterminado de int)

monstruo del trinquete
fuente
1

en su constructor está creando otra matriz int:

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

Prueba esto:

 data = {0,0,0};

NOTA: Por cierto, NO es necesario que inicialice los elementos de su matriz si se declara como una variable de instancia. Las variables de instancia obtienen automáticamente sus valores predeterminados, que para una matriz de enteros, los valores predeterminados son todos ceros.

Si tenía una matriz declarada localmente, aunque necesitaría inicializar cada elemento.

Mechkov
fuente
0

La mejor forma es no escribir declaraciones de inicialización. Esto se debe a que si escribe int a[]=new int[3]entonces de forma predeterminada, en Java todos los valores de la matriz a[0], es decir , a[1]y a[2]se inicializan en 0! Con respecto a la variable local que oculta un campo, publique su código completo para que lleguemos a una conclusión.

Kameron
fuente