前回のエラー
【1】前回作成した PersonTest.java を Person.java と PersonTest.java の2つに分けます。
保存先 C:\java\sample07
ファイル名 Person.java
public class Person {
private String name;
private int age;
private String address;
public Person(String _name, int _age, String _address) {
name = _name;
age = _age;
address = _address;
}
public void say(){
System.out.println("私の名前は" + name + "です。年齢は"
+ age + "才で、住所は" + address + "です。");
}
public void setName(String _name){
name = _name;
}
public void setAge(int _age){
age = _age;
}
public void setAddress(String _address){
address = _address;
}
}
保存先 C:\java\sample07
ファイル名 PersonTest.java
public class PersonTest {
public static void main(String[] args) {
Person[] people = new Person[2];
people[0] = new Person("太郎", 21, "東京都港区");
people[1] = new Person("花子", 18, "北海道札幌市");
for(int i = 0; i < people.length; i++){
people[i].say();
}
System.out.println("データを変更。");
people[0].setName("次郎");
people[0].setAge(15);
people[0].setAddress("福岡県福岡市");
people[1].setName("桃子");
people[1].setAge(25);
people[1].setAddress("宮城県仙台市");
for(int i = 0; i < people.length; i++){
people[i].say();
}
}
}
【2】sample07 に Person.java と PersonTest.java が保存されました。クラスファイルは削除してください。
【3】以下の図を参考に、カレントディレクトリの切り替え、コンパイルを行います。今度は上手くコンパイルできました。
*PersonTest.java をコンパイルすると、Person.java も自動でコンパイルされます。なぜならPersonTest.java で Person.java を利用しているからです。
コンパイルは以下のように別々に行ってもかまいません。
【4】sample07 にクラスファイルが2つ作成されています。
【5】プログラムの実行、結果の確認を行います。java PersonTest で実行します。
【解説】
プログラムの実行結果はこれまでと変わりませんが、フィールドへのアクセスの仕方が変わりました。
(1)Personクラス側のフィールドはアクセス修飾子を private にしたので、他のクラスからはアクセスできません。
private String name;
private int age;
private String address;
(2)そこで Personクラス側に、フィールドを間接的に操作するためのメソッドを用意しています。セッター(setter)のアクセス修飾子を public にすることで、これらのメソッドは他のクラスからアクセスできるように公開しています。
public void setName(String _name){
name = _name;
}
public void setAge(int _age){
age = _age;
}
public void setAddress(String _address){
address = _address;
}
*セッターのメソッド名は、set + フィールド名(頭文字を大文字)という特別な命名方法が推奨されています。
(3)PersonTest側からはセッターを呼び出すことで、間接的にフィールドを設定しています。セッターはメソッドなので実引数として値を渡せます。文字列は「"」ダブルクォーテーションで囲んでいます。
people[0].setName("次郎");
people[0].setAge(15);
people[0].setAddress("福岡県福岡市");
people[1].setName("桃子");
people[1].setAge(25);
people[1].setAddress("宮城県仙台市");
以上のようにフィールドは隠蔽しておいてメソッドを公開することで、カプセル化することができました。
でも「データをチェックしてからフィールドに設定する」機能を付けていないので、カプセル化のメリットがまだ十分に活かせていません。次回はこの点を改善します。