次元が追加されます。int[].classのint[]を仮にXとし、Xの配列を作ると考えれば納得します。
Java
1Array.newInstance(int[].class, new int[]{3,0});
2Array.newInstance(int[][].class, 3);
上のコードはどちらも、int[][][]配列を作成し、int[][][].length は 3 です。つまり一次元の要素数が引数で指定した 3 です。引数は int[]{3,0} なので二次元目のサイズが 0 ですが、これはダミーです。Array.newInstance()では、一次元目の要素数だけに意味があり、一次元の要素を持つ参照型の配列が実際にヒープに割り当てられます。
以下のように、1次元の各要素に、それぞれ要素数の異なる2次元配列を割り当てることができます。
Java
1Object o = Array.newInstance(int[].class, new int[]{3,0});
2int[][][] v = (int[][][])o;
3System.out.println(v.length);
4
5v[0] = new int[5][];
6v[1] = new int[30][];
7v[3] = new int[15][];
多次元配列は、以下のように異なるサイズの配列を宣言時に割り当てられます。
Java
1int[][][] v = {
2 {
3 {1,2,3},
4 {4,5,6,7},
5 {8,9,10,11,12},
6 {13,14,15,16,17},
7 },
8 {
9 {18},
10 {19,20},
11 {21,22,23},
12 {24,25,26,27},
13 {28,29,30,31,32},
14 }
15};
配列は次元ごとに初期化できるからです。
###誤りの訂正
指定した次元はすべて初期化されます。上の例では、3, 0 は正しく二次元まで初期化されます。配列の初期化と配列の要素に代入可能なこととを混同した説明になっています(恥だ)。できれば、Javaのソースコードを調べて回答します。
###訂正
java.lang.reflect.Array のソースコード(build 1.8.0_92-b14)を確認しました。newInstance()から以下のnativeメソッドを呼びます。nativeメソッドの詳細は不明です。
Java
1private static native Object newArray(Class<?> componentType, int length)
2 throws NegativeArraySizeException;
3
4private static native Object multiNewArray(Class<?> componentType, int[] dimensions)
5 throws IllegalArgumentException, NegativeArraySizeException;
配列の中身を確認しました。かっこ悪く力づくでダンプするやり方。
Java
1static void dump(Object o) {
2 System.out.println("---------------");
3 dump("",o);
4}
5static void dump(String indent, Object o) {
6 if (o == null) {
7 System.out.println("null");
8 return;
9 }
10 Class<?> cz = o.getClass();
11 if (cz == int[].class) {
12 dump(indent + " ", (int[]) o);
13 } else if (cz.isArray()) {
14 Object[] o1 = (Object[]) o;
15 System.out.println(
16 "type is " + cz.getTypeName() + " : length = " + o1.length
17 );
18 for (int i=0; i<o1.length; ++i) {
19 System.out.print(indent+" [" + i + "] : ");
20 dump((indent+" "), o1[i]);
21 }
22 } else {
23 System.out.print(indent + cz.getTypeName() + " : " + o + " ");
24 }
25}
26
27static void dump(String indent, int[] o1) {
28 System.out.print(
29 "type is " + o1.getClass().getTypeName()
30 );
31 System.out.print(" {");
32 for (int i=0; i<o1.length; ++i) {
33 System.out.print(((i==0)?"":",") + o1[i]);
34 }
35 System.out.println("}");
36}
配列の作成とダンプ。指定した次元はすべて初期化されます。
Java
1Object o = Array.newInstance(int[].class, new int[]{5, 2});
2dump(o);
3
4o = Array.newInstance(int[][].class, new int[]{5});
5dump(o);
実行結果
type is int[][][] : length = 5
[0] : type is int[][] : length = 2
[0] : null
[1] : null
[1] : type is int[][] : length = 2
[0] : null
[1] : null
[2] : type is int[][] : length = 2
[0] : null
[1] : null
[3] : type is int[][] : length = 2
[0] : null
[1] : null
[4] : type is int[][] : length = 2
[0] : null
[1] : null
type is int[][][] : length = 5
[0] : null
[1] : null
[2] : null
[3] : null
[4] : null
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/27 09:13
退会済みユーザー
2016/09/29 15:04 編集
退会済みユーザー
2016/09/28 02:13
退会済みユーザー
2016/09/29 15:05 編集