33 votes

Initialisation de tableau en java

J'ai remarqué que l'on pouvait écrire ce code, ce qui est parfaitement normal, par le moyen:

int arrays[] = {1, 2, 3};
for (int n : arrays)
   System.out.println(n);

Mais je ne vois pas comment la suite est illégal:

for (int n : {1, 2, 3})
   System.out.println(n);

À partir d'un compilateur de l'écrivain point de vue, ce n'introduit aucune ambiguïté, n'est ce pas? Le type de la matrice peuvent s'attendre à être le même type que l'élément déclaré précédemment. En d'autres termes, n est déclaré en tant que int, de sorte que le tableau doit être int[]

36voto

Eng.Fouad Points 44085

Vous avez besoin de cette syntaxe:

36voto

Makoto Points 23751

De la Java Language Specification, §10.6 - les Initialiseurs de Tableau:

Un initialiseur de tableau est écrit comme une liste séparée par des virgules expressions, délimitée par des accolades { et }.

Une virgule peut apparaître après la dernière expression dans un tableau initialiseur et est ignoré.

Chaque variable de l'initialiseur doit être compatible avec l'assignation (§5.2) avec le tableau du type de composant, ou une erreur de compilation se produit.

C'est une erreur de compilation si le type de composant de la matrice de initialisée est pas reifiable (§4.7).

Un initialiseur de tableau fait partie d'une création de la matrice d'expression, qui ne définissent que vous avez besoin de l'une de ces quatre formes pour réussir à initialiser un tableau:

ArrayCreationExpression:
    new PrimitiveType DimExprs Dimsopt
    new ClassOrInterfaceType DimExprs Dimsopt
    new PrimitiveType Dims ArrayInitializer 
    new ClassOrInterfaceType Dims ArrayInitializer

Encore une fois, de les specs:

C'est une erreur de compilation si le ClassOrInterfaceType ne désigne pas un reifiable type (§4.7). Sinon, le ClassOrInterfaceType peut-nom d'un nom de type de référence, même une classe abstraite de type (§8.1.1.1) ou un type d'interface (§9).

C'est pourquoi vous avez besoin de la syntaxe new int[] {1, 2, 3}.

EDIT: Pour obtenir de plus dans les nuances de votre question:

À partir d'un compilateur de l'écrivain point de vue, ce n'introduit pas de l'ambiguïté, n'est ce pas? Le type de la matrice peuvent être attendus à l' même type que l'élément déclaré précédemment. En d'autres termes, n est déclaré en tant que int, le tableau doit être de type int[]

Pas de. Il est l'ambiguïté. Comme exemple, quelle est la différence entre les deux énoncés suivants?

int[] arr1 = new int[] {1, 2, 3};
short[] arr2 = new short[] {1, 2, 3};

La différence majeure est que la compilation en bytecode. L'un est à l'évidence un int, l'autre est évidemment un court-circuit. Cependant, sans la capacité de dire quel type de données est qui (sans les valeurs dans le tableau dépassant Short.MAX_VALUE), il serait impossible d'affirmer que, de ce tableau, au-delà de l'ombre d'un doute, est une int. Rappelons qu'un short tombe dans la gamme de l' int, de sorte que vous pouvez facilement obtenir dans certains délicat/bizarre scénarios lors de l'utilisation que.

Il devient de plus en plus de plaisir: c'est le code valide.

for(int i : arr2) {
    System.out.println(i);
}

Encore une fois, tant que les éléments en arr2 ne pas dépasser Short.MAX_VALUE, vous pouvez vous en sortir avec cette référence ambiguë entre short et int.

C'est une autre raison pourquoi le compilateur ne peut simplement en déduire que tu veux dire int. Vous pourrait signifier short.*

*: N'est pas que beaucoup de gens jamais serait, mais ce n'est que dans le cas où il y en a qui ne.

7voto

Chris Chambers Points 623

Parce que les tableaux sont des objets, et doivent être instantanés. Java ne reconnaît pas en soi comme un tableau. Il vous permet toutefois d'utiliser un bloc de code (c'est-à-dire le code en ... ) pour définir les éléments initiaux du tableau.

La façon dont vous y parvenez est décrite par la réponse ci-dessus.

0voto

Sumit Sharma Points 889

Je pense que chaque fois que nous créons une variable , le compilateur alloue automatiquement de la mémoire.La quantité de mémoire créé dépend du type de compilateur que vous utilisez.Dans le premier relevé de compte que vous déclarez un tableau avec les entrées, compilateur de créer automatiquement l'espace de l'élément du tableau présent dans la table, mais lorsque vous déclarez le tableau dans une boucle à créer seulement 2 octets de chaque course.

Pour ex.

int x; // create 2 bytes of memory

Cet espace est définitivement attribué à int x si vous insérez valeur dans cet espace ou pas.

int x = "123"; // This code also take 2 bytes of memory and contain value = 123

De même,

int a[] ={1,2,3} // create 6 byte of space in memory, 2 byte for each integer variable.

En revanche, lorsque vous déclarez le tableau dans la boucle for sans l'aide de la nouvelle marque le compilateur suppose qu'elle est une variable int et ne créer que 2 octets d'espace mémoire et de programme provoque une erreur.

for (int n : {1, 2, 3}) // create only 2 bytes of memory

Ainsi, en utilisant le nouvel identificateur nous allouer un nouvel espace mémoire et insérez les valeurs qui sont indiquées dans les accolades.

-1voto

user2282158 Points 13

Pour être honnête, la seule erreur que je vois dans votre explication est comment pouvez-vous dire à un ordinateur de passer par un objet / mémoire qui n'existe pas?

Vous devez créer quelque chose pour laisser passer par elle d'abord, ici, vous n'avez rien créé et l'erreur logique existe dans votre tête parce que vous avez pensé plus profond que les règles de création de Java lui-même.

Ne vous inquiétez pas, je me retrouve dans des situations comme vous, mais la chose la plus importante est d'apprendre comment Java a été programmé en premier!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X