問題
次のコードについて正しい説明はどれですか。
public class Main {
public static void main(String... args) {
MyCalculator calc = new MyCalculatorImpl();
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
System.out.println(calc.addEven(nums));
System.out.println(calc.addOdd(nums));
}
}
class MyCalculatorImpl implements MyCalculator {
}
interface MyCalculator {
default int addEven(int... nums) {
int total = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] % 2 == 0)
total = add(total, nums[i]);
}
return total;
}
default int addOdd(int... nums) {
int total = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] % 2 != 0)
total = add(total, nums[i]);
}
return total;
}
private int add(int a, int b) {
return a + b;
}
}
選択肢
A)MyCalculatorImpl クラスはabstract クラスとして定義しなければならない
B)MyCalculator インターフェースのdefault メソッドは MyCalculatorImpl クラスでオーバーライドしなければならない
C)Main クラスの nums は int 型の配列であるため MyCalculator インターフェースのメソッドを呼び出すことはできない
D)MyCalculator インタフェースのprivate メソッドは MyCalculatorimpl クラスから呼び出すことができる
E)MyCalculator インタフェースでは abstract メソッドを定義しなければならない
F)MyCalculator インタフェースの private メソッドを呼び出すことができるのは MyCalculator インタフェースの default メソッドのみである
解答
A)MyCalculatorImpl クラスはabstract クラスとして定義しなければならない
B)MyCalculator インターフェースのdefault メソッドは MyCalculatorImpl クラスでオーバーライドしなければならない
C)Main クラスの nums は int 型の配列であるため MyCalculator インターフェースのメソッドを呼び出すことはできない
D)MyCalculator インタフェースのprivate メソッドは MyCalculatorimpl クラスから呼び出すことができる
E)MyCalculator インタフェースでは abstract メソッドを定義しなければならない
F)MyCalculator インタフェースの private メソッドを呼び出すことができるのは MyCalculator インタフェースの default メソッドのみである
解説
- A)MyCalculatorImpl クラスはabstract クラスとして定義しなければならない
- 誤りです。
MyCalculatorImpl
はMyCalculator
インターフェースを実装していますが、インターフェースのメソッドをオーバーライドしなくても具体的なクラスとして定義できます。
- 誤りです。
- B)MyCalculator インターフェースのdefault メソッドは MyCalculatorImpl クラスでオーバーライドしなければならない
- 誤りです。
default
メソッドはオーバーライドが必須ではありません。MyCalculatorImpl
でオーバーライドしなくても、デフォルトの実装が利用されます。
- 誤りです。
- C)Main クラスの nums は int 型の配列であるため MyCalculator インターフェースのメソッドを呼び出すことはできない
- 誤りです。
nums
はint
型の配列ですが、int... nums
という可変長引数として受け取ることができるので、問題なくメソッドを呼び出せます。
- 誤りです。
- D)MyCalculator インタフェースのprivate メソッドは MyCalculatorImpl クラスから呼び出すことができる
- 誤りです。
private
メソッドは定義されているクラスの内部からのみ呼び出すことができるため、MyCalculatorImpl
からは直接呼び出せません。
- 誤りです。
- E)MyCalculator インタフェースでは abstract メソッドを定義しなければならない
- 誤りです。インターフェースには
default
メソッドやprivate
メソッドのみを含むこともできるため、abstract
メソッドを定義する必要はありません。
- 誤りです。インターフェースには
- F)MyCalculator インタフェースの private メソッドを呼び出すことができるのは MyCalculator インタフェースの default メソッドのみである
- 正しいです。
private
メソッドは同じインターフェース内のdefault
メソッドからのみ呼び出すことができます。
- 正しいです。
対象資格:Java SE17 認定資格