連載
» 2008年03月05日 00時00分 公開

参照型の一種、インターフェイスを習得するソースコードで学ぶ SJC-P 5.0 ドリル(6)(2/2 ページ)

[山本道子,有限会社 Ray]
前のページへ 1|2       

解答

 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 { }

インターフェイス   クラス
interface A {
   void methodA();
}
 
class B {
   void methodB(){ }
}
implements↑
 
↑ extends
class C extends B implements A {
   public void methodA(){……}  // 必須
   void methodB(){……}      // 任意
}
併用する場合は、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の実行結果

スーパーインターフェイス
SuperAIF
SuperBIF
extends ↑
extends
   
SubIF
サブインタフェース
 
     ↑  implements
 
MyClass
実装クラス
図5 サンプルコード2の構造

筆者紹介

山本道子

有限会社Ray代表。千葉県出身。一般事務、派遣を経て2000年サン・マイクロシステムズ入社。J2SEのほか、J2EEなどサーバサイドJavaコース担当およびテキスト開発に携わる。2004年退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆などを手掛けている。



前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。