Print Friendly, PDF & Email

継承に関する問題です。

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()メソッドを使う。また、合計金額も求めること)

<メインメソッドの例>

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メソッドを活用して以下のプログラムが上記と同じ動作をするようにしなさい。

※なお、クラス名の衝突を避けるためクラス名の後ろに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を補っている。

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 出目を保持する
コンストラクタ

役割:フィールドnumを1~FACEのランダムな値で初期化する。

メソッド
メソッド名 アクセス修飾子 戻り値の型 役割
rollTheDice() public int 出目の値を返す
theDice() public void 出目の値を表示する

<テストクラスの例>

public class Q05 {

    public static void main(String[] args) {
        Dice d1 = new Dice();
        System.out.println(d1.rollTheDice());
        d1.theDice();
    }
}

<結果の例>

3
3

 

6.オリジナルクラスの作成

上記問題で作成したクラス図にオリジナルクラスを書き加えなさい。

例:自動車、椅子、スマートフォンなど。

(ホワイトボードにスーパークラスとオリジナルクラスを書く)

 

7.オリジナルクラスの実装

上記問題で作成したオリジナルクラス図を基にJavaで実装しなさい。

2.と同様の実行をすること。
(ペア・プログラミング)

 

8.オリジナル問題作成

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

 

以上。

 

 

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