問題
次のコードについて正しい説明はどれですか。
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 クラスとして定義しなければならない
→ 誤りです。MyCalculator
はインターフェースであり、default メソッドを持っているため、MyCalculatorImpl
クラスはインターフェースのメソッドを実装する義務がなく、そのまま具象クラスとして定義できます。abstract
とする必要はありません。
B)MyCalculator インターフェースの default メソッドは MyCalculatorImpl クラスでオーバーライドしなければならない
→ 誤りです。default メソッドはインターフェースで提供されているデフォルトの実装なので、オーバーライドする必要はありません。
C)Main クラスの nums は int 型の配列であるため MyCalculator インターフェースのメソッドを呼び出すことはできない
→ 誤りです。int[]
は可変長引数 (int...
) に渡すことができます。したがって、問題なくメソッドを呼び出すことができます。
D)MyCalculator インタフェースのprivate メソッドは MyCalculatorimpl クラスから呼び出すことができる
→ 誤りです。private
メソッドはそのインターフェース内からしか呼び出せません。実装クラス (MyCalculatorImpl
) から直接呼び出すことはできません。
E)MyCalculator インタフェースでは abstract メソッドを定義しなければならない
→ 誤りです。Java 8以降、インターフェースには default
メソッドを定義できるので、abstract
メソッドが必須ではありません。
F)MyCalculator インタフェースの private メソッドを呼び出すことができるのは MyCalculator インタフェースの default メソッドのみである
→ 正しいです。private
メソッドは同じインターフェース内で定義された default
メソッドや他の private
メソッドからのみ呼び出すことができます。
対象資格:Java SE17 認定資格