ava Gold試験では、「クラスとインターフェース」は必ず出る基礎かつ重要分野です。
しかも単なる知識ではなく、**「どれがコンパイルエラー?」「どの実装が正しい?」**といった問題で頻出。
この記事では、試験対策として必要なポイントをわかりやすく+実践問題付きで解説します。
1. クラスとインターフェースの正体
Javaにおける設計の基本ですが、Gold試験では「何ができるか」よりも「何をしたらコンパイルエラーになるか」の境界線が問われます。
- クラス: オブジェクトの「実体」を定義する設計図。
- インターフェース: オブジェクトの「振る舞い(約束)」を定義する仕様書。
【重要】インターフェースの隠れたルール
インターフェース内で宣言した変数は、修飾子を省略しても自動的に public static final(定数)となります。また、メソッドは基本的に public abstract です。
2. Java Goldで狙われる「4つの神器」
① defaultメソッド(Java 8〜)
インターフェースに「実装」を持たせることができます。これにより、既存のインターフェースに新しい機能を追加しても、実装クラスを壊さずに済みます。
② staticメソッド
インターフェース名で直接呼び出すメソッドです。実装クラスに継承されないという点が試験のひっかけポイントです。
③ 抽象クラス(abstract)との使い分け
「共通の内部状態(フィールド)を持ちたい」なら抽象クラス、「多重継承したい(共通の振る舞い)」ならインターフェースを選びます。
④ 多重継承と「菱形継承問題」
複数のインターフェースが同じシグネチャの default メソッドを持っている場合、実装クラスでは必ずオーバーライドして衝突を解消しなければなりません。
5. 実戦演習:Java Gold形式クイズ(全10問)
継承関係と修飾子のルールを正確に見極めましょう。
【第1問】インターフェースの実装義務
次のコードのうち、コンパイルエラーになるものはどれですか? A. interface A { void test(); } / abstract class B implements A {} B. interface A { void test(); } / class B implements A { public void test(){} } C. interface A { void test(); } / class B implements A { void test(){} } D. interface A { default void test(){} } / class B implements A {}
正解:C インターフェースのメソッドは暗黙的に
publicです。実装する側でpublicを付けないと、アクセス範囲を狭めることになり(パッケージプライベートになるため)、コンパイルエラーが発生します。
【第2問】インターフェースの変数
次のコードの説明として正しいものはどれですか? interface A { int VAL = 10; } A. VAL は private に変更できる B. VAL はインスタンス化しないと参照できない C. VAL は暗黙的に public static final である D. 実装クラスで VAL = 20; と書き換え可能である
正解:C インターフェースのフィールドはすべて定数です。書き換えは不可、アクセス修飾子は
public固定です。
【第3問】defaultメソッドの衝突
インターフェースAとBが共に default void hello() を持っています。class C implements A, B {} を定義した際の結果は? A. Aの hello() が優先される B. Bの hello() が優先される C. クラスCで hello() をオーバーライドしないとコンパイルエラーになる D. 実行時に例外が発生する
正解:C 重複する
defaultメソッドを多重継承した場合、どちらを使うかクラス側で明示(オーバーライド)する必要があります。
【第4問】staticメソッドの呼び出し
interface A { static void show() { System.out.println("A"); } } があるとき、正しい呼び出し方はどれですか? A. A.show(); B. new A(){}.show(); C. class B implements A {} を作って B.show(); D. class B implements A {} のインスタンスから b.show();
正解:A インターフェースの
staticメソッドは、そのインターフェース名を通じてのみ呼び出せます。実装クラスには継承されません。
【第5問】abstractクラスの継承
次のコードの結果はどうなりますか? abstract class Base { abstract void run(); } class Sub extends Base { void run() { System.out.println("Go"); } } A. 正常にコンパイルされる B. Sub で public を付けていないためコンパイルエラー C. Base がコンストラクタを持てないためコンパイルエラー D. run メソッドに @Override がないためコンパイルエラー
正解:A 抽象クラスのメソッドはデフォルトで「パッケージプライベート」にできるため、サブクラスで
publicを付けなくても(同じパッケージなら)コンパイルは通ります。ここがインターフェースとの大きな違いです。
【第6問】インターフェース間の継承
正しい記述はどれですか? A. interface A implements B {} B. interface A extends B, C {} C. class A extends B, C {} D. interface A extends class B {}
正解:B インターフェース同士の継承は
extendsを使い、かつ複数のインターフェースを同時に継承(多重継承)することが可能です。
【第7問】privateメソッド(Java 9〜)
インターフェース内で private メソッドを定義できるケースはどれですか? A. 常にできない B. default メソッドや他のメソッドから補助的に呼ばれる場合 C. 実装クラスでオーバーライドする場合 D. 変数の宣言時
正解:B Java 9から、インターフェース内のコード重複を避けるために
privateメソッド(およびprivate staticメソッド)を書けるようになりました。
【第8問】抽象クラスと具象クラス
abstract class A { abstract void play(); } を継承した class B が、さらに class C に継承されています。play() を実装しなければならないのはどこですか? A. 必ず B で実装しなければならない B. B も abstract なら、C で実装すればよい C. A ですでに実装されていなければならない D. どこでも実装しなくてよい
正解:B 最初の「具象クラス(抽象クラスではない普通のクラス)」が、すべての抽象メソッドを実装する責任を持ちます。
【第9問】finalメソッドの継承
class A { final void msg() {} } を継承した class B に関する説明として正しいものは? A. B で msg() をオーバーライドできる B. B で msg() をオーバーライドしようとするとコンパイルエラーになる C. A をインスタンス化できない D. B は msg() を呼び出すことができない
正解:B
finalメソッドは「変更不可」を意味するため、サブクラスでのオーバーライドを禁止します。
【第10問】インターフェースの修飾子
インターフェースのメソッドに付けてはいけない修飾子はどれですか? A. default B. static C. final D. private
正解:C インターフェースのメソッドは「いつか誰かが実装(またはオーバーライド)すること」を前提としているため、上書きを禁止する
finalを付けることはできません。
まとめ:合格へのチェックリスト
[ ] インターフェースのメソッド実装時は public 忘れに注意 [ ] default メソッドが衝突したら、実装クラスでオーバーライド [ ] static メソッドは インターフェース名.メソッド名 で呼ぶ [ ] フィールドはすべて定数(public static final) [ ] 内部リンク:ラムダ式&Stream API攻略ガイド もチェック!


コメント