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

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

本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。

[山本道子,有限会社 Ray]

 連載第6回の今回は、インターフェイスに関する出題です。

インターフェイスとは

 インターフェイスはstaticな定数と、抽象メソッドのみを持つクラスです。前回紹介した抽象クラスと同様にインスタンス化はできません。また宣言時はclassではなくinterfaceキーワードを使用します。

【構文】
[修飾子] interface インターフェイス名 { }

(例)
public interface MyInterface { }

インターフェイスでのメソッド

 インターフェイスに定義するメソッドは抽象メソッドのみです。処理内容を持つ通常のメソッドは定義できません。抽象メソッドの構文は抽象クラスのときと同様ですが、インターフェイスの場合は、使用できるアクセス修飾子はpublicのみです。インターフェイスで宣言したメソッドは、publicなabstractメソッドであることが決まっているため、明示的にpublic abstractを指定していなくても、コンパイラによって強制的に付加されます。

ソースファイル  
interface MyInterface {
    public abstract void methodA();
    abstract void methodB();
    void methodC();
    // protected abstract void methodD();
}
protected はコンパイルエラー
 
コンパイル
 
 
クラスファイルの中のイメージ  
interface MyInterface {
    public abstract void methodA();
    public abstract void methodB();
    public abstract void methodC();
}
暗黙で public abstract になる
図1 インターフェイスでのメソッドの例  

インターフェイスでの変数

 インターフェイスに定義できる変数はpublicなstatic指定されたfinalな変数、つまり定数のみです。もし明示的にpublic static finalを指定していなくても、コンパイラによって強制的に付加されます。このようにインターフェイスでは必ず定数となるため、初期化しておかないとコンパイルエラーとなります。

ソースファイル  
interface MyInterface {
  // int a;
  int b = 10;
  final int c = 20;
  public int d = 30;
  static int e = 40;
  public final int f = 50;
}
             
a初期化していないのでコンパイルエラー
 
コンパイル
 
 
クラスファイルの中のイメージ  
interface MyInterface {
    public static final int b = 10;
    public static final int c = 20;
    public static final int d = 30;
    public static final int e = 40;
    public static final int f = 50;
}
暗黙でpublic static finalになる
図2 インターフェイスでの変数の例  

インターフェイスを利用する

 インターフェイス自体はインスタンス化できないため、インターフェイスで宣言されたメソッドをオーバーライドしたクラスを用意する必要があります。これをインターフェイスの実装クラスと呼びます。実装クラスの宣言時には、implementsキーワードを使用し、インターフェイス名を指定します。

【構文】
[修飾子] class クラス名 implements インターフェイス名{ }

(例)
public interface MyInterface { }
public class MyClass implements MyInterface { }

 implementsの後には、1つ以上のインターフェイスを複数指定することができます。複数指定する場合は、カンマ(,)で区切ります。そして、その実装クラスは、インターフェイスで宣言されたメソッドをすべて実装する必要があります。また、オーバーライドする際には、public修飾子を付ける必要があります。

インターフェイス  
interface MyInterface {
   void method();
}
        
コンパイルすると……
public abstract void method();
となる
↑ implements
 
実装クラス  
class MyClass implements MyInterface {
   public void method(){  }
}
オーバーライドする際のアクセス修飾子の決まりに従うため 実装クラスは必ずpublicを指定
図3 インターフェイスの実装クラスの例

interface MyInterface {
  // int a; // 初期化していないのでコンパイルエラー
  int b = 10;
  final int c = 20;
  public int d = 30;
  static int e = 40;
  public final int f = 50;
  
  public abstract void methodA();
  abstract void methodB();
  void methodC();
  // ↓protectedは使用不可。コンパイルエラー
  // protected abstract void methodD(); 
}
class MyClass implements MyInterface { // 実装クラス
  public void methodA(){}
  public void methodB(){} // publicを付けないとコンパイルエラー
  public void methodC(){} // publicを付けないとコンパイルエラー
}
サンプルコード1 インターフェイスを実装したプログラムの例


演習問題

 以下の問題を考えてみてください。解答と解説は次のページにあります。

問題

 次のプログラムをコンパイルし、実行するとどうなりますか? 1つ選択してください。

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

A. YYX
B. YXX
C. XXY
D. XYY
E. コンパイルエラー

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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