未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】オブジェクト指向の基本問題2-3

title


問題2-3

人を表すPersonクラスを作成してください。

Personクラスを使用するClassNormalPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)


【Personクラス】
Personクラスには次の2つのインスタンスフィールドがあります。

  1. 氏名を表すname(String型)
  2. 年齢を表すage(int型)


Personクラスには5つのインスタンスメソッドが必要です。

  1. 氏名と年齢をオブジェクトにセットするためのsetDataメソッド
  2. 年齢の情報を取得するためのgetAgeメソッド
  3. 名前の情報を取得するためのgetNameメソッド
  4. 自己紹介をするintroduceメソッド
  5. 引数で渡ってきた他の人と年齢を比較する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公式アカウント

仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】


LineOfficial

友だち追加



【まついのLINE公式アカウントはこちらから!】
Line公式アカウント