a) int i[] = new int[2]{1,2};
b) int[] i = new int[]{1,2,3}{4,5,6};
宣言で配列のサイズを指定できないことはわかっています。しかし、ステートメント(a)では、初期化でサイズを指定しています。次に、ステートメント(a)は違法であり、ステートメント(b)はJavaで合法です
int i1[] = new int[]{1,2};
int[][] i2 = new int[][]{{1,2,3},{4,5,6}};
int i1 [] = new int [2] {1, 2}; // Invalid
int i2 [] = new int [] {1, 2}; // Valid
int [] i3 = new int [][] {1, 2, 3} {4, 5, 6}; // Invalid
int [][] i4 = new int [][] {new int [] {1, 2, 3}, new int [] {4, 5, 6}}; // Valid
Java 言語仕様を参照してみませんか?
JLS 15.10 - 配列作成式
ArrayCreationExpression:
new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer
new ClassOrInterfaceType Dims ArrayInitializer
DimExprs:
DimExpr
DimExprs DimExpr
DimExpr:
[ Expression ]
Dims:
[ ]
Dims [ ]
これは、初期化子を使用した配列作成式には空の括弧のみを含めることができることを意味することに注意してください。
配列初期化子は 10.6 で定義されています
ArrayInitializer:
{ VariableInitializersopt ,opt }
VariableInitializers:
VariableInitializer
VariableInitializers , VariableInitializer
The following is repeated from §8.3 to make the presentation here clearer:
VariableInitializer:
Expression
ArrayInitializer
どちらも違法です!
a) サイズまたはコンテンツのいずれかを指定します。法的には次のようになります。
int i[] = new int[2];
i[0] = 1;
i[1] = 2;
また
int i[] = new int[]{1,2};
b) 2 次元配列は、配列を含む配列です。したがって、次のように記述する必要があります。
int[] i = new int[][]{{1,2,3}, {4,5,6}};
^ ^ ^
a) 配列初期化子が提供されている場合、次元式を定義できません int i[] = new int[2]; b) トークンの構文エラー、構文の配置ミス int[] j = new int[]{1,2,3};