前回まで使っていた taro とhanako はPersonクラス型のインスタンスで同じ型でしたね。これを people というインスタンス名にまとめてみましょう。
【1】sample02 フォルダをフォルダごとコピーして、sample04 フォルダを作ります。

【2】sample04 の PersonTest.java を以下のように修正します。

保存先 C:\java\sample04
ファイル名 PersonTest.java
class Person {
String name;
int age;
String address;
Person(String _name, int _age, String _address) {
name = _name;
age = _age;
address = _address;
}
void say(){
System.out.println("私の名前は" + name + "です。年齢は"
+ age + "才で、住所は" + address + "です。");
}
}
class PersonTest {
public static void main(String[] args) {
Person[] people = new Person[2];
people[0] = new Person("太郎", 21, "東京都港区");
people[1] = new Person("花子", 18, "北海道札幌市");
people[0].say();
people[1].say();
}
}
【3】コマンドプロンプトを起動して、カレントディレクトリを sample04 にします。

【4】javac PersonTest.java と入力し、コンパイルします。

【5】java PersonTest と入力し、プログラムを実行します。データが表示されたら成功です。

【解説】
(1)プログラムの実行結果は前回までと変わりませんが、インスタンス名に同じ名前が付けられ、番号で区別しています。このプログラムの実行結果を簡単な図で表すと以下のようになります。

(2)「インスタンスの定義」と「配列の定義」は似ていてまぎらわしいので、整理してみましょう。インスタンスの定義は比較しやすいように2行に分けて書きます。
・インスタンス名の宣言とインスタンスの生成
Person taro = new Person("太郎", 21, "東京都港区");
↓以下のように2行に分けて書いても同じ意味です。
Person taro;
taro = new Person("太郎", 21, "東京都港区");
・配列名の宣言とインスタンスの生成
Person[] people = new Person[2];
people[0] = new Person("太郎", 21, "東京都港区");
インスタンスの定義のほうは問題ないと思います。それでは配列の定義をよく見てください。new演算子が2回使われていますね。1回目の new は配列名の宣言で、2回目の new がインスタンスの生成です。
ポイントはカッコの形です。配列は[]ですが、インスタンスの生成はコンストラクタを呼び出すので()になっています。これで区別できます。
(3)配列の定義の構造をまとめると以下のようになります。
配列のデータ型[] 配列名 = 配列の要素の型[要素数];
配列名[インデックス] = new コンストラクタ(実引数リスト);
要素数は配列を何個用意するかということで、1から数えます。インデックスは 0 から始まり、要素数-1までになります。つまり配列を2個用意すると、0と1が使えるわけです。
*要素数とインデックスの「ズレ」に注意してください。10番目の要素のインデックスは9になります。
1 2 3 4 5 6 7 8 9 10 要素数
0 1 2 3 4 5 6 7 8 9 インデックス
(4)インスタンスのメソッドを呼び出すときは、配列名に番号を付けて区別します。
people[0].say();
people[1].say();
とりあえず今回のプログラムでも動きますが、このままでは不十分です。メソッドの呼び出し部分で似たようなコードになっています。
配列は「繰り返し」の制御文と一緒に使うとメリットが活かせます。次回は「for文」を使って、配列をもっと有効に使えるようにします。