Javaプログラミング基礎 演習問題

解答は

に提出しなさい。クラスファイル (〜.class) は提出しなくてよい。 提出には gFTP 等の ftp ソフトを用いること。

問題1 (Basic)

問題1-1

「携帯電話」-「カメラ付き携帯」のような継承関係にある2つのクラスを、 身の周りから探しなさい。また、継承関係にあると判断した理由も答えなさい。

解答は文章でファイル Q1-1.txt に記述すること。

問題1-2

「学校」-「大学」-「私立大学」のような関係は、大学は学校としての性質を 受け継ぎ、私立大学は大学としての性質を受け継いでいることから、 3階層の継承関係と考えることができる。 身の周りから3階層にわたるクラスの継承関係を探しなさい。 また、そう判断した理由も答えなさい。

解答は文章でファイル Q1-2.txt に記述すること。

問題2 (Basic)

次のクラス定義は、 クラスを用いたプログラムの最初の回の演習問題 で作成した PETBottle である。

class PETBottle {
    private String name;
    private int volume;

    public void setName(String n) {
	name = n;
    }

    public String getName() {
	return name;
    }

    public void setVolume(int v) {
	volume = v;
    }

    public int getVolume() {
	return volume;
    }

    public void drunk(int drinked) {
	volume = volume - drinked;
    }
}

このクラスを継承し ジュースの継ぎ足しができるペットボトルのクラス RefillablePETBottle を作成しなさい。 属性とメソッドの宣言において、 適切なアクセス修飾子 (public/protected/private) についても考えること。

RefillablePETBottle クラスには、 ジュースを追加する refill メソッドを作成し、 引数で与えられた量が追加されるようにする。

クラス RepeatDrinker に main メソッドを作成し、 RefillablePETBottle を用いて ジュースを飲んだり、継ぎ足したりする様子が表示されるようにしなさい。 (ファイル名: RepeatDrinker.java)

プログラムの大まかな構成は以下のとおりである。

public class RepeatDrinker {
    public static void main(String[] args) {

        // RefillablePETBottle を用い、ジュースを飲んだり、
        // 継ぎ足したりする様子をプログラムとして表す

    }
}

class PETBottle {

    // PETBottle クラスの定義が書かれる

}

class RefillablePETBottle ......

    // PETBottle クラスを継承した RefillablePETBottle の定義が書かれる

}

問題3 (Standard)

「人」を表す Person クラスを考える。 人間といっても様々な人がいる、ということで次のような人間を考えてみる。

年齢を聞いたときの答えとして

という3種類の人間を考えよう。

このような人々をクラスで表現することを考える。 まずは、共通部分をまとめた基底クラス Person を定義する。

class Person {
    protected String name;
    protected int age;

    public Person() { }

    public Person(String n, int a) {
        name = n;
        age = a;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return 0;
    }
}

上のように、年齢を求める getAge メソッドは、とりあえず意味のない値 (0) を返すことにしておく。

このクラス Person を継承し、 正直な年齢を答えるクラス HonestPerson と、 大体の年齢を答えるクラス VaguePerson と、 さばを読んだ年齢を答えるクラス Liar を作成しなさい。 継承を行った各サブクラスで getAge メソッドをオーバライドし、 年齢を答えるように作る。

大体の年齢とは 10 歳単位で四捨五入した歳とする。 int 型での計算であれば次の式で求めることができる。

((age + 5) / 10) * 10

さばを読んだ年齢とは、年齢に応じてさばを読み度合を変化させるものとし、 20歳未満であれば実年齢、 20歳以上30歳未満であれば「実年齢-1」、 30歳以上40歳未満であれば「実年齢-2」、 40歳以上50歳未満であれば「実年齢-3」、 50歳以上であれば「実年齢-4」を答えるものとする。

クラス VariousPeople に main メソッドと 各自の自己紹介をする introduce メソッドを作成し、 正直な人、いい加減な人、さばを読む人のそれぞれに自己紹介をしてもらう。 (ファイル名 VariousPeople.java)

プログラムの大まかな構成および main メソッドの例は以下のとおりである。

public class VariousPeople {
    public static void main(String[] args) {
        HonestPerson maurice = new HonestPerson("Maurice White", 24);
        VaguePerson philip = new VaguePerson("Philip Bailey", 32);
        Liar jonny = new Liar("Jonny Graham", 45);

        introduce(maurice);
        introduce(philip);
        introduce(jonny);
    }

    private static void introduce(Person p) {
        System.out.println("Hello, my name is " + p.getName());
        System.out.println("I'm  " + p.getAge() + " years old.");
        System.out.println();
    }
}

// 基底クラス Person
class Person {
    protected string name;
    protected int age;

    public Person() { }

    public Person(String n, int a) {
        name = n;
        age = a;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return 0;
    }
}

// 正直な年齢を答える人
class HonestPerson .....
    // コンストラクタは継承されないので定義する 
    public HonestPerson(String n, int a) {
        ..... // (super を使うと良い)
    }

    // getAge メソッドをオーバライド
    public int getAge() {
        ....
    }
}

// あいまいな年齢を答える人
class VaguePerson .....
    .....


// さばを読んだ年齢を答える人
class Liar ....
....

問題4 (Advanced)

問題4-1

CDとDVD Videoについて考えよう。 CDには音楽作品(Music)が複数記録されており、 DVD Videoには映像作品(Movie)が複数記録されている。

ここで、音楽作品と映像作品の性質を考えると、 どちらも作者(演奏家)と題名を持つ似たような性質のものだと考えられる。 そこで、まず音楽作品と映像作品に共通する性質を抽出し スーパクラスとして「コンテンツ(Content)」を定義し、 コンテンツを継承することで「音楽」と 「映像」のクラスを定義することが考えられる。 ただし、映像作品には、言語音声の種類や字幕、 視聴可能なリージョン(国や地域)などの情報が含まれているとする。

以上のような考え方に基づき、 コンテンツ (クラス Content)、 音楽 (クラス Music)、 映像 (クラス Movie) を作成しなさい。

ファイル名は VariousMedia.java とし、適当な main メソッドを書くこと。

問題4-2

上で定義したコンテンツが複数記録できるディスク (クラス Disc) を作成し、 この Disc クラスを継承する形で CD (クラス CompactDisc) 、DVD Video (クラス DVDVideo) を作成しなさい。

ファイル名は CDAndDVD.java とし、適当な main メソッドを書くこと。

問題4-3

上で定義した DVD Video が視聴できる DVD プレーヤを表すクラス DVDPlayer を定義しなさい。 DVD プレーヤでは DVD Video の再生だけではなく CD も演奏可能なものとすること。

視聴や演奏をすると言っても、 実際に本物の動画や音楽を再生するわけではなく、 "Now playing: 題名 (作者)" のように、 再生の様子を表示することにする。

ファイル名は DVDWatcher.java とする。 適当な映像作品を題材とした DVD Video および、 適当な音楽作品を題材とした CD を作成し、 再生できる様子を main メソッドに書くこと。