継承に関する問題です。
1.クラス図の作成
次のクラス仕様書を元にクラス図を作成しなさい。
なお、以下のいずれのクラスのメソッドにも引数列はない。
スーパークラス Goods
役割:商品を表現する。
フィールド
フィールド名 | アクセス修飾子 | 型 | 役割 |
name | protected | String | 商品名を保持する |
price | protected | int | 価格を保持する |
コンストラクタ
役割:フィールドを初期化する。
メソッド
メソッド名 | アクセス修飾子 | 戻り値の型 | 役割 |
show() | public | void | 商品名と価格を出力する(例.商品名:〇〇 価格:×× ) |
getPrice() | public | int | フィールドpriceを返す |
サブクラス1 Clothes extends Goods
役割:商品の一種である衣服を表現する。
フィールド
フィールド名 | アクセス修飾子 | 型 | 役割 |
color | private | String | 色を保持する(例:白、黒、赤、青) |
size | private | String | サイズを保持する(例:S,M,L,LL) |
コンストラクタ
役割:フィールドを初期化する。
メソッド
メソッド名 | アクセス修飾子 | 戻り値の型 | 役割 |
show() | public | void | 商品名と価格、色とサイズを出力する(例.商品名:〇〇 価格:×× 色:〇〇 サイズ:××) |
サブクラス2 Computer extends Goods
役割:商品の一種であるコンピューターを表現する。
フィールド
フィールド名 | アクセス修飾子 | 型 | 役割 |
osType | private | String | OSタイプを保持する(例:Windows、Mac、Linux) |
memory | private | int | メモリ容量を保持する(例:256、512) |
コンストラクタ
役割:フィールドを初期化する。
メソッド
メソッド名 | アクセス修飾子 | 戻り値の型 | 役割 |
show() | public | void | 商品名と価格、OSタイプとメモリ容量を出力する(例.商品名:〇〇 価格:×× OSタイプ:〇〇 メモリ:××) |
2.クラス図を実装
上記問題で作成したクラス図を基にJavaで実装しなさい。
その際はできるだけ差分プログラミングによりサブクラスの記述を少なくすること。
オブジェクト配列を使ってポリモーフィズムを実感すること。
(すべてのインスタンスのshow()メソッドを使う。また、合計金額も求めること)
※ヒント:スーパークラスのメソッドをサブクラスで呼び出すには、super.メソッド名()と書きます。
<メインメソッドの例>
package p10;
public class Q02 {
public static void main(String[] args) {
Goods[] g = {
new Goods("ハンカチ", 750),
new Computer("パソコンA", 100000, "Win2004", 256),
new Computer("パソコンB", 150000, "WinYP", 516),
new Clothes("Jeans390", 4000, "青", "LL")};
int total = 0;
for (int i = 0; i < g.length; i++) {
g[i].show();
total += g[i].getPrice();
}
System.out.println("----------------------------");
System.out.println("合計金額:" + total + "円");
}
}
<アウトプット例>
----------------- 商品名:ハンカチ 価格:750 ----------------- 商品名:パソコンA 価格:100000 OSタイプ:Win2004 メモリ容量:256 ----------------- 商品名:パソコンB 価格:150000 OSタイプ:WinYP メモリ容量:516 ----------------- 商品名:Jeans390 価格:4000 色:青 サイズ:LL ---------------------------- 合計金額:254750円 |
3.toStringメソッドのオーバーライド
上記2で作成した3つのクラスにObjectクラスのtoStringメソッドをオーバーライドしなさい。
その上でtoStringメソッドを活用して上記Q02.java と同じ動作をするようにしなさい。
※なお、クラス名の衝突を避けるため以下の例ではGoods1のようにクラス名の後ろに1を補っている。
package p10;
public class Q03 {
public static void main(String[] args) {
Goods1[] g = {
new Goods1("ハンカチ", 750),
new Computer1("パソコンA", 100000, "Win2004", 256),
new Computer1("パソコンB", 150000, "WinYP", 516),
new Clothes1("Jeans390", 4000, "青", "LL")};
int total = 0;
for (int i = 0; i < g.length; i++) {
System.out.println(g[i]);
total += g[i].getPrice();
}
System.out.println("----------------------------");
System.out.println("合計金額:" + total + "円");
}
}
この例のように、プログラムのアウトプットを変えずにソースコードの内部構造を整理することをリファクタリング(refactoring)といいます。
4.equalsメソッドのオーバーライド
上記3で作成したGoods1クラスにObjectクラスのequalsメソッドとhashCodeメソッドをオーバーライドしたGoods2クラスを作成しなさい。
IDEの便利機能を使うこと。
なお、商品名さえ同じであればequalsメソッドはtrueを返すように実装しなさい。
hashCodeメソッドはIDEの提案をそのまま受け入れること。
※なお、クラス名の衝突を避けるため全てのクラス名の後ろに2を補っている。
package p10;
public class Q04 {
public static void main(String[] args) {
Goods2 g1 = new Computer2("winn", 100, "x1", 256);
Goods2 g2 = new Computer2("winn", 100, "x1", 512);
Goods2 g3 = new Computer2("muc", 100, "x1", 256);
System.out.println(g1.equals(g2));
System.out.println(g1.equals(g3));
}
}
<結果>
true false |
5.Randomクラスの継承
java.util.Randomクラスを継承して6面から成るサイコロクラスを作成しなさい。
クラス Dice
役割:サイコロを表現する。
フィールド
フィールド名 | アクセス修飾子 | 型 | 役割 |
FACE | private | int | 面の数を保持する定数 |
num | private | int | 出目を保持する |
コンストラクタ
役割:デフォルトコンストラクタ。
メソッド
メソッド名 | アクセス修飾子 | 戻り値の型 | 役割 |
rollTheDice() | public | int | 出目の値をnumに代入した上で表示する。またnumの値を返す。(サイコロを転がすイメージ) |
nextInt() | public | int | java.util.Randomの同名のメソッドをオーバーライドする。サイコロの面の数の値を返す。上記rollTheDice()の中で使用される。 |
<テストクラスの例>
package p10;
public class Q05 {
public static void main(String[] args) {
Dice d1 = new Dice();
for (int i = 0; i < 10; i++) {
d1.rollTheDice();
}
}
}
<結果の例>
3 5 6 2 2 2 3 5 5 3 |
6.オリジナルクラスの作成
上記問題で作成したクラス図にオリジナルクラスを書き加えなさい。
例:自動車、椅子、スマートフォンなど。
(ホワイトボードにスーパークラスとオリジナルクラスを書く)
7.オリジナルクラスの実装
上記問題で作成したオリジナルクラス図を基にJavaで実装しなさい。
2.と同様の実行をすること。
(ペア・プログラミング)
8.オリジナル問題作成
将来の後輩のために良い問題が出来たら教えてください。
以上。