Javaプログラミング基礎

演習問題

解答は

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

問題1

以下に挙げるA → Bの組み合わせは、B が A を継承しているものと、 B が A のインスタンスになっているものがある。 それぞれの組について、 「継承関係」(クラス-サブクラスの関係)か、 「クラス-インスタンスの関係」かを判定しなさい。

  1. A:「大学」→ B:「私立大学」
  2. A:「私立大学」→ B:「東京電機大学」
  3. A:「電大生」→ B:「情報メディア学科の学生」

ヒント: A はクラスなので、A のインスタンスがどんなものかを考え、 B がそれにあてはまるかを判断するとわかりやすい。 例えば「大学」クラスのインスタンスは、大学であれば持っている共通の性質を持つ、 個々の大学である。

性質を引き継いでいるものが継承関係、と考えると、 インスタンスも当然クラスで定義された性質を持っており、 間違いやすいので注意すること。 B が A クラスの性質を継承したクラスであるとき、継承関係となる。

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

問題2

以下の 1,2,3 の関係を考えてみる。

  1. 「自動車」
  2. 「トヨタ車」
  3. 「トヨタ製の自分の車」

「トヨタ車」は自動車の一種であり、「自動車」の性質を継承しているので、 「自動車」のサブクラスと考えることができる。

「トヨタ製の自分の車」は、「トヨタ車」の具体的な1台であるので、 「トヨタ車」クラスのインスタンス(の1つ)と考えることができる。

この「トヨタ製の自分の車」は、 「トヨタ車」が「自動車」の性質を継承しているため、 「自動車」の性質も持っている。 よって「トヨタ製の自分の車」は、 「自動車」クラスのインスタンスとして考えることもできる。

上記 1,2,3 の関係と同じ関係を満たす 3つの組を、 身のまわりから探して記述しなさい。 1,2,3 の番号と対応づけて記述すること。 ファイル名は Q2.txt とする。

問題3

次のクラス定義は、 クラスを用いたプログラムの最初の回の演習問題 で作成した 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)

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

class PETBottle {

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

}

class RefillablePETBottle ......

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

}

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

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

    }
}

問題4

「人」を表す 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 と、 さばを読んだ年齢を答えるクラス Lier を作成しなさい。 継承を行った各サブクラスで 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 メソッドの例は以下のとおりである。

class VariousPeople {
    public static void main(String[] args) {
        HonestPerson maurice = new HonestPerson("Maurice White", 24);
        VaguePerson philip = new VaguePerson("Philip Bailey", 32);
        Lier jonny = new Lier("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 Lier ....
....