解答
D
解説
1行目はFooインターフェイスを定義しています。
1. interface Foo { public void exec(); } |
2〜4行目ではFooインターフェイスを実装したXクラスを定義していますが、Fooインターフェイスのexec()メソッドを正しくオーバーライドしているため構文上に問題はありません。
2. class X implements Foo { 3. public void exec() { System.out.print("X"); } 4. } |
5〜7行目ではそのXクラスを継承したYクラスを定義していますが、構文上に問題はありません。
5. class Y extends X { 6. public void exec() { System.out.print("Y"); } 7. } |
8行目のZクラスはYクラスをスーパークラスに持ち、Fooインターフェイスを実装したクラスとして定義されています。extends、implementsの順番でクラス宣言がされているため、問題ありません。implements、extendsの順番で記述するとコンパイルエラーとなります。
8. class Z extends Y implements Foo { } |
インターフェイス | クラス | |||
|
|
|||
implements↑ |
↑ extends |
|||
|
||||
併用する場合は、extendsを先に書くこと |
||||
図4 implementsとextendsを併用も可能 |
従って、演習問題のソースコードをコンパイル・実行すると、 12行目の呼び出しに対して3行目が実行、13行目の呼び出しに対して6行目が実行、 14行目の呼び出しに対して6行目が実行され、実行結果が「XYY」となります。
【問題】 1. interface Foo { public void exec(); } 2. class X implements Foo { 3. public void exec() { System.out.print("X"); } 4. } 5. class Y extends X { 6. public void exec() { System.out.print("Y"); } 7. } 8. class Z extends Y implements Foo { } 9. 10. public class Test{ 11. public static void main(String[] args) { 12. X x = new X(); x.exec(); 13. Y y = new Y(); y.exec(); 14. Z z = new Z(); z.exec(); 15. } 16. } |
あるインターフェイスを基に、サブインターフェイスを作成することができます。継承関係を持つため、サブインターフェイスを作成する際にはextendsキーワードを使用します。また、インターフェイスの継承は、extendsキーワードの後に複数のインターフェイスを指定することが許可されています。
ただし、サブインターフェイスを実装した具象クラスは、スーパーインターフェイスおよびサブインターフェイスのメソッドをすべてオーバーライドする必要があります(サンプルコード2)。
interface SuperAIF { // スーパーインターフェイス void methodA(); } interface SuperBIF { // スーパーインターフェイス void methodB(); } // サブインターフェイス。複数のインターフェイスを継承可能 interface SubIF extends SuperAIF, SuperBIF { void methodC(); } class MyClass implements SubIF { // サブインターフェイス実装クラス public void methodA() { System.out.println("methodA()"); } public void methodB() { System.out.println("methodB()"); } public void methodC() { System.out.println("methodC()"); } } class Sample2 { public static void main(String[] args) { MyClass c = new MyClass(); c.methodA(); c.methodB(); c.methodC(); } } |
サンプルコード2 サブインターフェイスを作成したプログラムの例 |
C:sample> C:sample>java Sample2 methodA() methodB() methodC() C:sample> |
サンプルコード2の実行結果 |
スーパーインターフェイス |
|||
|
|
||
extends ↑ |
↑ extends |
|
サブインタフェース | ||
↑ implements |
|||
|
実装クラス |
図5 サンプルコード2の構造 |
山本道子
有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。
Copyright © ITmedia, Inc. All Rights Reserved.