継承に関する問題です。

1.クラス図の作成

次のクラス仕様書を元にクラス図を作成しなさい。

なお、以下のいずれのクラスのメソッドにも引数列はない。

スーパークラス Goods

役割:商品を表現する。

フィールド
フィールド名アクセス修飾子役割
nameprotectedString商品名を保持する
priceprotectedint価格を保持する
コンストラクタ

役割:フィールドを初期化する。

メソッド
メソッド名アクセス修飾子戻り値の型役割
show()publicvoid商品名と価格を出力する(例.商品名:〇〇 価格:×× )
getPrice()publicintフィールドpriceを返す

サブクラス1 Clothes extends Goods

役割:商品の一種である衣服を表現する。

フィールド
フィールド名アクセス修飾子役割
colorprivateString色を保持する(例:白、黒、赤、青)
sizeprivateStringサイズを保持する(例:S,M,L,LL)
コンストラクタ

役割:フィールドを初期化する。

メソッド
メソッド名アクセス修飾子戻り値の型役割
show()publicvoid商品名と価格、色とサイズを出力する(例.商品名:〇〇 価格:×× 色:〇〇 サイズ:××)

サブクラス2 Computer extends Goods

役割:商品の一種であるコンピューターを表現する。

フィールド
フィールド名アクセス修飾子役割
osTypeprivateStringOSタイプを保持する(例:Windows、Mac、Linux)
memoryprivateintメモリ容量を保持する(例:256、512)
コンストラクタ

役割:フィールドを初期化する。

メソッド
メソッド名アクセス修飾子戻り値の型役割
show()publicvoid商品名と価格、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

役割:サイコロを表現する。

フィールド
フィールド名アクセス修飾子役割
FACEprivateint面の数を保持する定数
numprivateint出目を保持する
コンストラクタ

役割:デフォルトコンストラクタ。

メソッド
メソッド名アクセス修飾子戻り値の型役割
rollTheDice()publicint出目の値をnumに代入した上で表示する。またnumの値を返す。(サイコロを転がすイメージ)
nextInt()publicintjava.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.オリジナル問題作成

将来の後輩のために良い問題が出来たら教えてください。

以上。

JavaSEの問題集トップページに戻る