defaultメソッド×配列検索×argsでハマった1問を解説
はじめに
Java Silverの問題で、 「読めば読めるはずなのに、なぜか混乱する」
そんな1問に出会いました。
interface / defaultメソッド / 配列 / args が 一気に出てくる、かなり情報量の多い問題です。
この記事では、なぜこの問題の答えが B になるのかを 1行ずつ・順番に解説します。
問題概要
public class Sample {
public static void main(String[] args) {
if (new C().search(
new int[]{1, 2, 3, 7, 9},
Integer.parseInt(args[0])
)) {
System.out.println("A");
} else {
System.out.println("B");
}
}
}
実行コマンド:
java Sample 5 2
public interface A {
boolean search(int[] data, int target);
}
A は 「search というメソッドを持つ」ことだけを約束する
インターフェースです。
処理内容はまだ書きません。
interface B(defaultメソッド)
public interface B extends A {
@Override
default boolean search(int[] data, int target) {
int cnt = 0;
for (int i : data) {
if (i == target) {
cnt++;
}
}
return cnt > 0;
}
}
searchメソッドの意味
- 配列 data をすべて調べる
- target と同じ値が1つでもあれば true
- なければ false
return cnt > 0;
この1行が、検索結果を true / false に変換している。
public class C implements B {
}
C クラスは search を実装していませんが、
B の defaultメソッドをそのまま使えるため、問題ない。
ちなみに、extendsとimplementsの違いです。
-extends のイメージ
親の能力・性質・実装をそのまま引き継ぐ
- implements のイメージ
「この能力を持っていると約束する」だけ
mainメソッドの処理
Integer.parseInt(args[0])
コマンドライン引数
java Sample 5 2
この時に使用しているのは args[0]のみである。
searchに渡される値
search(
new int[]{1, 2, 3, 7, 9},
5
)
配列の中身
1, 2, 3, 7, 9
target
5
一致する値はないため、cnt は 0となる。
cnt = 0;
return cnt > 0; // false
if文の判定
今回はfalseなので
new C().search(
new int[]{1, 2, 3, 7, 9},
Integer.parseInt(args[0])
ここの文がfalseとなる
if (false) {
System.out.println("A");
} else {
System.out.println("B");
}
結果
B が表示される
この問題で問われているポイント
- interface の役割
- defaultメソッドの仕組み
- 拡張for文の読み方
- boolean の戻り値が if に与える影響
- args[0] の扱い
情報量が多いですが、
1つずつ追えば必ず理解できます。
Discussion