問題2-3
人を表すPersonクラスを作成してください。
Personクラスを使用するClassNormalPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)
【Personクラス】
Personクラスには次の2つのインスタンスフィールドがあります。
- 氏名を表すname(String型)
- 年齢を表すage(int型)
Personクラスには5つのインスタンスメソッドが必要です。
- 氏名と年齢をオブジェクトにセットするためのsetDataメソッド
- 年齢の情報を取得するためのgetAgeメソッド
- 名前の情報を取得するためのgetNameメソッド
- 自己紹介をするintroduceメソッド
- 引数で渡ってきた他の人と年齢を比較するcompareメソッド
【実行結果】
わたしの名前は大島、年齢は30歳です。 わたしの名前は村上、年齢は30歳です。 わたしの名前は黒沢、年齢は32歳です。 わたくし大島は、村上さんと同じ年齢です。 わたくし大島は、黒沢さんより2歳年下です。 わたくし黒沢は、村上さんより2歳年上です。
【ClassNormalPractice.java】
public class ClassNormalPractice { public static void main(String[] args) { // Personクラスのオブジェクトを作成 Person[] persons = { new Person(), new Person(), new Person() }; // Personオブジェクトに氏名と年齢をセット persons[0].setData("大島", 30); persons[1].setData("村上", 30); persons[2].setData("黒沢", 32); // 自己紹介 for(int i = 0; i < persons.length; i++) { persons[i].introduce(); } System.out.println(); // 年齢差をチェック persons[0].compare(persons[1]); persons[1].compare(persons[2]); persons[2].compare(persons[1]); } } // ここにPersonクラスを作成してください。
解答例
【ClassNormalPractice.java】
public class ClassNormalPractice { public static void main(String[] args) { // Personクラスのオブジェクトを作成 Person[] persons = { new Person(), new Person(), new Person() }; // Personオブジェクトに氏名と年齢をセット persons[0].setData("大島", 30); persons[1].setData("村上", 30); persons[2].setData("黒沢", 32); // 自己紹介 for(int i = 0; i < persons.length; i++) { persons[i].introduce(); } System.out.println(); // 年齢差をチェック persons[0].compare(persons[1]); persons[1].compare(persons[2]); persons[2].compare(persons[1]); } } // Personクラス class Person { // 名前 private String name; // 年齢 private int age; // オブジェクトにデータをセットする public void setData(String name, int age) { this.age = age; this.name = name; } // 年齢取得メソッド public int getAge() { return age; } // 名前取得メソッド public String getName() { return name; } // 自己紹介メソッド public void introduce() { System.out.println("わたしの名前は" + name + "、" + "年齢は" + age + "歳です。"); } // 年齢差比較メソッド public void compare(Person person) { // 自分の方が年上の場合 if(age > person.getAge()) { System.out.println("わたくし" + name + "は、" + person.getName() + "さんより" + (age - person.getAge()) + "歳年上です。"); } // 自分の方が年下の場合 else if(age < person.getAge()) { System.out.println("わたくし" + name + "は、" + person.getName() + "さんより" + (person.getAge() - age) + "歳年下です。"); } // 同じ年齢の場合 else { System.out.println("わたくし" + name + "は、" + person.getName() + "さんと同じ年齢です。"); } } }
解説
今回の問題は、年齢差を比較するcompareメソッドが要になっています。
オブジェクト指向に慣れていないと、引数の解釈で躓いた人もいるかもしれません。
compareメソッド以外は割とオーソドックスです。
introduceメソッドはmainメソッドの中でそのまま呼び出しており、戻り値を使っていないので戻り値の型がvoid型のメソッドであることが分かります。
compareメソッドの定義を、次のように書き始める人がとても多いです。
// 年齢差比較メソッド public void compare(Person[] persons) { .....
今回の問題は、Personクラスを定義することです。
定義するとは、使ってもらうために作ることです。
今回、mainメソッドではPersonクラスを配列として使っていますが、定義する方が配列に引っ張られてはいけません。
あと、上記のコードの引数名が「persons」になっているのもダメです。
複数形はマズいです。
mainメソッドのpersonsローカル変数はPerson配列型ですが、compareメソッドに渡しているのは配列の1つの要素、つまりPerson型なので「s」はつけてはいけません。
あとは、引数で渡ってきた「他人」の年齢と、「自分」の年齢をif文で比較して表示を切り替えるだけです。
うまくいかなかった人は、もう一度落ち着いてトライしてみてください。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】