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; } }
クラス Arithmetic に掛け算を行うメソッド public void multiply(int x) を追加せよ。 メソッド multiply() 内で、現在の result の値と引数 x を掛けた数を result に設定せよ。 main()メソッドで、 multiply()を呼び出した後、getResult()を呼び、掛け算の結果を表示する処理を追加せよ。
クラス Arithmetic に割り算を行うメソッド public void divide(int x) を追加せよ。 メソッド divide() 内で、現在の result の値と引数 x を割った数の整数部分を result に設定せよ。 main()メソッドで、 divide()を呼び出した後、getResult()を呼び、割り算の整数部分を表示する処理を追加せよ。
クラス Arithmetic に割り算の余りを保持するフィールド private int leftover を追加せよ。 メソッド divide() 内で、割り算の余りをleftover に設定せよ。
クラス Arithmetic に割り算の余りを返すメソッド public int getLeftOver() を追加せよ。 メソッド getLeftOver() で、leftover の値を返却せよ。 main()メソッドで、 divide()を呼び出した後、getLeftOver()を呼び、割り算の余りを表示する処理を追加せよ。
クラス Arithmetic に引数無しのコンストラクタを追加せよ。 コンストラクタ内でクラス Arithmetic で利用している全てのフィールド { result, leftover } を 0 で初期化せよ。 (実行結果の表示は変更しなくて良い)
class A { int a; } class B extends A { int b; }
上記例では、クラスB はクラスAを継承する。
つまり、B は A のサブクラスであり、A は B のスーパークラスである。
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 を継承するようにソースを修正せよ。
class E { int value(){ return 10; } } class F extends E { int value(){ return 20; } }
上記例では、クラスFのメソッド value() はクラスEのメソッド value()を再定義 (オーバーライド) している。
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 を修正せよ。
class I { int value(){ return 10; } int value(int i){ return i; } }
上記例では、クラスI でメソッド value() をオーバーロードしている。
つまり、引数の違う value() メソッドが複数存在する。
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)の値を返すよう定義せよ。
class K { int value() { return 10; } } class L extends K { int value() { return ( super.value() + 10); } }
上記例では、クラス L のメソッド value() からスーパークラス K のメソッド value() を super.value() で呼び出している。
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()メソッドを修正せよ。
abstract class P { abstract int value(); } class Q extends P{ int value() { return 10; } }
上記例では、クラス Q は抽象クラス P を継承している。 つまり、クラス Q では クラス P の抽象メソッド value() を実装している。
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 で正しく抽象メソッドを定義せよ。