問題2-2
ペットを表すPetクラスを作成してください。
Petクラスを使用するClassBasicPracticeクラスのmainメソッドはすでに完成しています。
(変更は禁止です)
【Petクラス】
Petクラスは次の4つのprivateインスタンスフィールドを持ちます。
- 動物の種類を保持するためのtypeフィールド(String型)
- 名前を保持するためのnameフィールド(String型)
- 年齢を保持するためのageフィールド(byte型)
- 性別を保持するためのgenderフィールド(boolean型 ture:メス false:オス)
また、Petクラスは次の5つのpublicメソッドを持ちます。
- 動物の種類を設定するためのsetTypeメソッド
- 名前を設定するためのsetNameメソッド
- 年齢を設定するためのsetAgeメソッド
- 性別を設定するためのsetGenderメソッド
- 紹介文を取得するためのgetIntroductionメソッド
(紹介文の内容は下記の実行結果を参考にしてください)
【実行結果】
犬のコタローはオスで4歳です。 猫のミーはメスで2歳です。
【ClassBasicPractice.java】
public class ClassBasicPractice { public static void main(String[] args) { // 1匹目のペットオブジェクトの生成 Pet pet1 = new Pet(); // 1匹目のペットデータを設定 pet1.setType("犬"); pet1.setName("コタロー"); pet1.setAge((byte)4); pet1.setGender(false); // 2匹目のペットオブジェクトの生成 Pet pet2 = new Pet(); // 2匹目のペットのデータを設定 pet2.setType("猫"); pet2.setName("ミー"); pet2.setAge((byte)2); pet2.setGender(true); // 2匹のペットの紹介文を取得し、表示する System.out.println(pet1.getIntroduction()); System.out.println(pet2.getIntroduction()); } } // ここにPetクラスを作成してください。
解答例
【ClassBasicPractice.java】
public class ClassBasicPractice { public static void main(String[] args) { // 1匹目のペットオブジェクトの生成 Pet pet1 = new Pet(); // 1匹目のペットデータを設定 pet1.setType("犬"); pet1.setName("コタロー"); pet1.setAge((byte)4); pet1.setGender(false); // 2匹目のペットオブジェクトの生成 Pet pet2 = new Pet(); // 2匹目のペットのデータを設定 pet2.setType("猫"); pet2.setName("ミー"); pet2.setAge((byte)2); pet2.setGender(true); // 2匹のペットの紹介文を取得し、表示する System.out.println(pet1.getIntroduction()); System.out.println(pet2.getIntroduction()); } } // Petクラス class Pet { // タイプ private String type; // 名前 private String name; // 年齢 private byte age; // 性別(true:メス false:オス) private boolean gender; // 種類を設定する public void setType(String type) { this.type = type; } // 名前を設定する public void setName(String name) { this.name = name; } // 年齢を設定する public void setAge(byte age) { this.age = age; } // 性別を設定する public void setGender(boolean gender) { this.gender = gender; } // 紹介文を取得する public String getIntroduction() { String tmp; tmp = type + "の" + name + "は"; if(gender) { tmp += "メス"; } else { tmp += "オス"; } tmp += "で" + age + "歳です。"; return tmp; } }
解説
今回の問題は、クラス作成の基本的な問題です。
インスタンスフィールドが4つもありますが、それほど難しい問題ではないと思います。
getIntroductionメソッドの作成が少し難しかったかもしれません。
クラスの要素を「メンバ」と言いますが、大きく分けて「フィールド」と「メソッド」の2種類があります。
一般的には、先にフィールドの定義を行います。
今回の問題では、すべてのインスタンスフィールドをprivateアクセスにするように指示されています。
これは大切なことで、一般的にはインスタンスフィールドはprivateに設定し、外部から直接アクセスできないようにします。
これを「データの隠蔽」と言います。
そして外部からデータを設定・取得するには、それ専用のpublicなメソッドを作成します。
それを「アクセサメソッド」と言います。
その中でもデータを取得するためのメソッドは「ゲッターメソッド」と言いますが、今回は必要ありません。
その代わり、データを設定するための「セッターメソッド」を定義します。
「ゲッターメソッド」は「引数なしで戻り値あり」、「セッターメソッド」は「引数ありで戻り値なし」が一般的です。
今回も4つのインスタンスフィールドに値を設定するセッターメソッドを4つ作成します。
ゲッターメソッドはありませんが、紹介文の取得にはgetIntroductionメソッドを使用します。
ここで勘違いしてはいけないのは、getIntroductionメソッドにはString型の戻り値があることです。
メソッドの中にSystem.out.println
を用いて説明文を出力してしまうのはNGです。
なぜなら、mainメソッドでは、getIntroductionメソッドの戻り値をSystem.out.println
を用いて出力しているからです。
getIntroductionメソッドの説明文を作るときの注意としては、性別genderインスタンスフィールドがboolean型なので、適切に「オス」「メス」という文字列に変換しないといけない点です。
if文を用いるのが一番簡単ですが、次のように条件演算子(三項演算子)を用いる方法もあります。
条件演算子を用いれば、return文一行で記述することが可能です。
// 紹介文を取得する public String getIntroduction() { return type + "の" + name + "は" + (gender ? "メス" : "オス") + "で" + age + "歳です。"; }
解答例では、わかりやすさを重視して、条件演算子は使わずにString型のローカル変数tmpを用いて少しずつ文字列を連結していきました。
あと、性別の分岐のところで次のようなif文を記述した方がいるかもしれません。
if(gender == true) { tmp += "メス"; } else { tmp += "オス"; }
もし上記のように記述してしまった方は、絶対にこのように書かないように気をつけましょう。
if文の条件式に使える値はboolean型だけですが、「genderがtrueと等しい場合」というのはgender変数がtrueの場合だけなので、比較演算子==
は不要です。
あと、if文の条件式にうっかり「gender = true」と、代入演算子を書いてしまうバグを入れてしまうおそれもあります。
参考図書
LINE公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】