PersonTest.java のソースファイルは Person と PersonTest という2つのクラスからできています。
このプログラムを実行したときの概要をまとめると以下の図のようになります。説明がわからなくなったらこの図を思い出してください。
(1)まず Person クラスでは、フィールド(変数)の定義を行っています。StringはStringクラス型(文字列)、intは整数型です。
String name;
int age;
String address;
(2)次に Person クラスで、コンストラクタというクラス名と同じ名前のメソッド(手続き)を定義しています。コンストラクタはインスタンス化された時に自動で呼び出されます。
_name、_age、_addressを仮引数といいます。仮引数にはデータ型と変数名を書きます。データ型は呼び出しもとの実引数の値にあわせます。
Person(String _name, int _age, String _address) {
name = _name;
age = _age;
address = _address;
}
このコンストラクタでは、インスタンス化された時に、仮引数として受け取った値をフィールドに代入しているだけです。仮引数名が _name のようになっているのは、フィールド名の name と区別するためです。
もしフィールド名と仮引数名を同じ名前にするなら、フィールド名には this を付けなければなりません。
this.name = name;
以上のように Person クラスはフィールドやコンストラクタの定義をしているだけです。クラスのインスタンス化や画面表示は、 PersonTest クラス側で行っています。
(3)PersonTest クラスにはJavaアプリケーションを実行した時に、最初に呼び出される main メソッドがあります。クラスのインスタンス化や画面表示は、 main メソッドの中に書いています。
(4)クラス(型枠)のインスタンス(実体)化には new 演算子を使います。実体化したインスタンスを後で使えるようにクラス型の変数 taro に代入しています。
Person taro = new Person("太郎", 21, "東京都港区");
クラス名 変数名 = new コンストラクタ(実引数,,)
実引数は文字列は「"」ダブルクォーテーションで囲み、複数ある場合は「,」カンマで区切ります。実引数の個数とデータ型は仮引数側と一致するようにします。
実引数の値がコンストラクタの仮引数に入ると考えてください。
Person(String _name, int _age, String _address)
仮引数に入った値がフィールドに代入されますから、結果としてインスタンス化する時の仮引数がインスタンスの初期値となります。
(5)インスタンスのフィールドの値は、インスタンス名.フィールド名 で参照できますので、以下のように println() メソッドを使って画面に出力できます。println() メソッドの引数に、文字列とインスタンスのフィールドを結合して指定しています。
System.out.println("名前:" + taro.name
+ " 年齢:" + taro.age + " 住所:" + taro.address);
(6)同じように インスタンス hanako の作成と出力を行っています。
Person hanako = new Person("花子", 18, "北海道札幌市");
System.out.println("名前:" + hanako.name
+ " 年齢:" + hanako.age + " 住所:" + hanako.address);
(7)最初の図をもう一度見てください。ポイントはクラス(型枠)のフィールドに値を代入するのではなく、一度インスタンスを作成し、インスタンスのフィールドに値を代入している点です。
つまり taro と hanako のフィールドは、同じ名前でもまったく別物です。フィールド名だけではどちらのフィールドかわからないので、taro.name、hanako.name のように頭にインスタンス名を書いて区別します。あとで出てきますが、インスタンスのメソッドについても同じように呼び出します。
*インスタンスをオブジェクトということもあります。
*実は static 宣言したフィールドやメソッドは、インスタンス化しなくても使えます。これについては後々説明します。しかし通常はクラスをインスタンス化してから使うという手順を覚えておいてください。