ソフトウエア入門演習

オブジェクト指向プログラミング基本機構(復習)

解説

提出課題

public class Arithmetic {
    private int result; //フィールド定義

    public static void main(String[] args){
        Arithmetic math = new Arithmetic();
        int answer;

        math.clear();
        math.add(1);
        math.add(2);
        answer = math.getResult();
        System.out.println("1 + 2 = " + answer);

        math.clear();
        math.add(5);
        math.subtract(2);
        answer = math.getResult();
        System.out.println("5 - 2 = " + answer);

    }

    public void clear(){
        result = 0;
    }

    public void add(int x){
        result = result + x;
    }

    public void subtract(int x){
        result = result - x;
    }

    public int getResult(){
        return result;
    }

}

課題3-1

クラス Arithmetic に掛け算を行うメソッド public void multiply(int x) を追加せよ。 メソッド multiply() 内で、現在の result の値と引数 x を掛けた数を result に設定せよ。 main()メソッドで、 multiply()を呼び出した後、getResult()を呼び、掛け算の結果を表示する処理を追加せよ。

課題3-2

クラス Arithmetic に割り算を行うメソッド public void divide(int x) を追加せよ。 メソッド divide() 内で、現在の result の値と引数 x を割った数の整数部分を result に設定せよ。 main()メソッドで、 divide()を呼び出した後、getResult()を呼び、割り算の整数部分を表示する処理を追加せよ。

課題3-3

クラス Arithmetic に割り算の余りを保持するフィールド private int leftover を追加せよ。 メソッド divide() 内で、割り算の余りをleftover に設定せよ。

課題3-4

クラス Arithmetic に割り算の余りを返すメソッド public int getLeftOver() を追加せよ。 メソッド getLeftOver() で、leftover の値を返却せよ。 main()メソッドで、 divide()を呼び出した後、getLeftOver()を呼び、割り算の余りを表示する処理を追加せよ。

課題3-5

クラス Arithmetic に引数無しのコンストラクタを追加せよ。 コンストラクタ内でクラス Arithmetic で利用している全てのフィールド { result, leftover } を 0 で初期化せよ。 (実行結果の表示は変更しなくて良い)

課題3-6

class A {
    int a;
}

class B extends A {
    int b;
}

上記例では、クラスB はクラスAを継承する。
つまり、B は A のサブクラスであり、A は B のスーパークラスである。

Test1.java

class C {
    int c = 10;
}

class D {
    int d = 20;
}

public class Test1{
    public static void main(String[] args){
        D testd = new D();
        System.out.println("testd.c = "+ testd.c);
    }
}

上記Test1.java では、クラスD が クラスC を継承していないため、
System.out.println("testd.c = "+ testd.c); で コンパイルエラーが発生する。 正しくクラスD がクラスC を継承するようにソースを修正せよ。

課題3-7

class E {
    int value(){
        return 10;
    }
}

class F extends E {
    int value(){
        return 20;
    }
}

上記例では、クラスFのメソッド value() はクラスEのメソッド value()を再定義 (オーバーライド) している。

Test2.java

class G {
    int value(){
        return 30;
    }
}

class H extends G {

}

public class Test2{
    public static void main(String[] args){
        H testh = new H();
        System.out.println("testh.value() = "+ testh.value());
    }
}

上記Test2.java では、testh.value()メソッドが 40 を返すように クラスH の中で クラスG の value()メソッドをオーバーライド(再定義) したい。 クラスH の value()メソッドが 40 を返すように クラスH を修正せよ。

課題3-8

class I {
    int value(){
        return 10;
    }

    int value(int i){
        return i;
    }
}

上記例では、クラスI でメソッド value() をオーバーロードしている。
つまり、引数の違う value() メソッドが複数存在する。

Test3.java

class J {
    int value(int j){
        return j;
    }
}

public class Test3{
    public static void main(String[] args){
        J testj = new J();
        System.out.println("testj.value() = "+ testj.value());
        System.out.println("testj.value(0) = "+ testj.value(0));
    }
}

上記Test3.java では、testj.value() でコンパイルエラーが起きる。 コンパイルエラーが起きないように、クラス J を修正し、 value() メソッドをオーバーロードせよ。 オーバーロードした value()メソッドは、整数型(int)の値を返すよう定義せよ。

課題3-9

class K {
    int value() {
        return 10;
    }
}

class L extends K {
    int value() {
        return ( super.value() + 10);
    }
}

上記例では、クラス L のメソッド value() からスーパークラス K のメソッド value() を super.value() で呼び出している。

Test4.java

class M {
    int m = 10;

    int value() {
        return m;
    }
}

class N extends M {
    int n = 20;

    int value() {
        return n;
    }
}

public class Test4{
    public static void main(String[] args){
        N testn = new N();
        System.out.println("testn.value() = "+ testn.value());
    }
}

変数 n と スーパークラス M の value() メソッドの値の合計を返すようにクラス N の value()メソッドを修正せよ。

課題3-10

abstract class P {
    abstract int value();
}

class Q extends P{
    int value() {
        return 10;
    }
}

上記例では、クラス Q は抽象クラス P を継承している。 つまり、クラス Q では クラス P の抽象メソッド value() を実装している。

Test5.java

abstract class R {
    abstract int value();
}

class S extends R{

}


public class Test5{
    public static void main(String[] args){
        S tests = new S();
        System.out.println("tests.value() = "+ tests.value());
    }
}

上記 Test5.java では、クラス S が正しく抽象クラス R を継承していないため、 コンパイルが通らない。 コンパイルが通るように、クラス S で正しく抽象メソッドを定義せよ。


ソフトウエア基礎
このWebページはマッキンケネスジェームスが ソフトウェア入門・演習向けに作成したものを大見嘉弘が修正したものである。
mackin@rsch.tuis.ac.jp