Java Initialise un tableau int dans un constructeur

90

J'ai une classe et dans cette classe j'ai ceci:

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

Puis dans mon constructeur:

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

Si je fais cela, tout va bien. Les valeurs de données par défaut sont initialisées mais si je le fais à la place:

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

Ça dit:

Local variable hides a field

Pourquoi?

Quelle est la meilleure façon d'initialiser un tableau à l'intérieur du constructeur?

Favolas
la source
J'espère que vous connaissez le concept de portée de variable? votre variable dataaprès a "//some code"une portée de la classe entière. tandis que la variable datadans le constructeur a une portée à l'intérieur du constructeur. et une fois le constructeur terminé, la variable sera détruite. Et aussi la datavariable à l'intérieur du constructeur masque la variable du même nom dans la classe. Cela justifie l'erreurLocal variable hides a field
Naveen Babu

Réponses:

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

Cela initialise déjà vos éléments de tableau à 0. Vous n'avez pas besoin de répéter cela dans le constructeur.

Dans votre constructeur, cela devrait être:

data = new int[]{0, 0, 0};
Bhesh Gurung
la source
Oui. C'était la seule façon que cela me permettait. Mettre juste des données; dit que "ce n'est pas une déclaration". Merci
Favolas
Ne peut-il pas utiliser data=new int[3]dans le constructeur par défaut Date()?
parsecer
7

Vous pouvez soit faire:

public class Data {
    private int[] data;

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

Qui s'initialise datadans le constructeur, ou:

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

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

Qui s'initialise dataavant que le code du constructeur ne soit exécuté.

Pillingworth
la source
Je dois mettre data = new int [] {0,0,0}; à l'intérieur du constructeur. Si je initialise avant le code dans le constructeur en mettant juste des données; à l'intérieur du constructeur m'a donné une erreur "pas une déclaration"
Favolas
s'il y a plus de millions d'éléments dans le tableau .. vous voudriez utiliser le premier code et changer la ligne public Data() throws Error {si OutOfMemoryErrorelle sera lancée.
pseudo
4

En effet, dans le constructeur, vous avez déclaré une variable locale avec le même nom qu'un attribut.

Pour allouer un tableau d'entiers dont tous les éléments sont initialisés à zéro, écrivez ceci dans le constructeur:

data = new int[3];

Pour allouer un tableau d'entiers qui a d'autres valeurs initiales, placez ce code dans le constructeur:

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

ou:

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

pourquoi pas simplement

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

la raison pour laquelle vous avez l'erreur est que int[] data = ...déclare une nouvelle variable et masque le champdata

cependant il faut noter que le contenu du tableau est déjà initialisé à 0 (la valeur par défaut de int)

monstre à cliquet
la source
1

dans votre constructeur, vous créez un autre tableau int:

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

Essaye ça:

 data = {0,0,0};

REMARQUE: Au fait, vous n'avez PAS besoin d'initialiser vos éléments de tableau s'il est déclaré comme variable d'instance. Les variables d'instance obtiennent automatiquement leurs valeurs par défaut, qui pour un tableau d'entiers, les valeurs par défaut sont toutes des zéros.

Si vous aviez un tableau déclaré localement, vous devrez initialiser chaque élément.

Mechkov
la source
0

Le meilleur moyen est de ne pas écrire d'instructions d'initialisation. C'est parce que si vous écrivez int a[]=new int[3]alors par défaut, en Java toutes les valeurs de tableau c'est à dire a[0], a[1]et a[2]sont initialisées à 0! En ce qui concerne la variable locale masquant un champ, publiez l'intégralité de votre code pour que nous puissions conclure.

Kameron
la source