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 で正しく抽象メソッドを定義せよ。