多次元配列の一番シンプルな形が二次配列なので、二次配列について説明していきます。以下に仕様を定めます。
| 1期 | 2期 | 3期 | 4期 | |
|---|---|---|---|---|
| 1年目 | 100 | 140 | 200 | 150 |
| 2年目 | 130 | 120 | 150 | 200 |
| 3年目 | 110 | 170 | 160 | 180 |
この仕様を満たすソースコードは以下の通り。
J201/J201.java
/**
* 二次配列を使用します。
*/
public class J201 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
// int[][]型インスタンスの生成、参照型変数 earningsの宣言と紐づけ
int[][] earnings = new int[3][];
// int[]型インスタンスの生成と初期化
earnings[0] = new int[] { 100, 140, 200, 150};
earnings[1] = new int[] { 130, 120, 150, 200};
earnings[2] = new int[] { 110, 170, 160, 180};
// 総計
int sum = 0;
for(int j = 0; j < earnings.length; j ++) {
System.out.print((j + 1) + "年目: ");
int sumYear = 0;
for(int i = 0; i < earnings[j].length; i ++) {
System.out.print(earnings[j][i] + " ");
sumYear += earnings[j][i];
}
System.out.println("合計: " + sumYear);
sum += sumYear;
}
System.out.println("総計: " + sum);
}
}
実行結果は以下の通り。
1年目: 100 140 200 150 合計: 590 2年目: 130 120 150 200 合計: 600 3年目: 110 170 160 180 合計: 620 総計: 1810
以下の点に注意してください。
earnings.lengthは、「変数 earningsが参照する int[][]型インスタンスの配列の大きさ」(今回は 3)を表している。earnings[j].lengthは、「変数 earningsが参照する int[][]型インスタンスの j番目(0~2番目)の要素の参照先にある int[]型インスタンスの配列の大きさ」(今回はいずれも 4)を表している。イメージとしては以下のような感じです。なお、int型変数 sum, sumYearおよび String型インスタンスの記述を省略しています。

一次配列のときと同様に、参照型の宣言と同時に、配列インスタンスの初期化をする場合、予約 newを省略して記述することができます。
ソースコードは以下の通り。
J202/J202.java
/**
* 二次配列を使用します(初期化します)。
*/
public class J202 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
// int[][]型インスタンス、int[]型インスタンスの生成と初期化
// 参照型変数 earningsの宣言と紐づけ
int[][] earnings = {
{ 100, 140, 200, 150},
{ 130, 120, 150, 200},
{ 110, 170, 160, 180},
};
// 総計
int sum = 0;
for(int j = 0; j < earnings.length; j ++) {
System.out.print((j + 1) + "年目: ");
int sumYear = 0;
for(int i = 0; i < earnings[j].length; i ++) {
System.out.print(earnings[j][i] + " ");
sumYear += earnings[j][i];
}
System.out.println("合計: " + sumYear);
sum += sumYear;
}
System.out.println("総計: " + sum);
}
}
実行結果は以下の通り。
1年目: 100 140 200 150 合計: 590 2年目: 130 120 150 200 合計: 600 3年目: 110 170 160 180 合計: 620 総計: 1810
最も注意する点は、予約語newを 1回も使用していないにも関わらず、配列インスタンスは先のプログラムと同じく 4個作成されることです。また、16行目の最後のコンマ「,」は記述しなくても動作しますが、記述しておいたほうが見栄えも良く、今後、再び並び替えや追加を行う場合に便利です。
イメージとしては以下のような感じです。なお、int型変数 sum, sumYearおよび String型インスタンスの記述を省略しています。

大きさの異なる二次配列も実現可能です。
| 1期 | 2期 | 3期 | 4期 | |
|---|---|---|---|---|
| 1年目 | 100 | 140 | 200 | 150 |
| 2年目 | 130 | 120 | 150 | 200 |
| 3年目 | 110 | 170 |
この仕様を満たすソースコードは以下の通り。
J203/J203.java
/**
* 大きさの異なる二次配列を使用します。
*/
public class J203 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
// int[][]型インスタンス、int[]型インスタンスの生成と初期化
// 参照型変数 earningsの宣言と紐づけ
int[][] earnings = {
{ 100, 140, 200, 150},
{ 130, 120, 150, 200},
{ 110, 170},
};
// 総計
int sum = 0;
for(int j = 0; j < earnings.length; j ++) {
System.out.print((j + 1) + "年目: ");
int sumYear = 0;
for(int i = 0; i < earnings[j].length; i ++) {
System.out.print(earnings[j][i] + " ");
sumYear += earnings[j][i];
}
System.out.println("合計: " + sumYear);
sum += sumYear;
}
System.out.println("総計: " + sum);
}
}
実行結果は以下の通り。
1年目: 100 140 200 150 合計: 590 2年目: 130 120 150 200 合計: 600 3年目: 110 170 合計: 280 総計: 1470
earnings[j].lengthの値は、jが 0および 1のときには 4、jが 2のときには 2になることに注意してください。
イメージとしては以下のような感じです。なお、int型変数 sum, sumYearおよび String型インスタンスの記述を省略しています。

値を指定せずに二次配列を宣言することができます。この形も予約語 newを少し省略した形となります。
ソースコードは以下の通り。
J204/J204.java
/**
* 二次配列インスタンスを宣言します。
*/
public class J204 {
/**
* メインメソッド。
* @param args 引数
*/
public static void main(String[] args) {
int[][] earnings = new int[3][4];
System.out.println("earningsの参照先の配列インスタンスの大きさは " + earnings.length);
}
}
実行結果は以下の通り。
earningsの参照先の配列インスタンスの大きさは 3
予約語 newは 1回しか使っていないにも関わらず、配列インスタンスは合計 4個作成されることに注意してください。また、int[][]型の各要素には int[]型配列インスタンスへの参照が設定され、int[]型の各要素は、int型のインスタンスフィールドであるため 0に初期化されます。
イメージとしては以下のような感じです。なお、String型インスタンスの記述を省略しています。

三次元配列以上の配列も同様の形態です。基本型の場合、一次部分に実際の値を格納する箱が存在し、二次以上の部分は下位への参照となっています。