解答
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.