本連載は、サン・マイクロシステムズ認定のJava資格Sun Certified Programmer for Java 2 Platform 5.0(SJC-P5.0)に対応しています。最新の出題傾向に基づいて、ソースコードの問題を中心に毎回模擬問題を1問出題します。ソースコードに慣れながら、SJC-P合格を目指して頑張りましょう。
連載第6回の今回は、インターフェイスに関する出題です。
インターフェイスはstaticな定数と、抽象メソッドのみを持つクラスです。前回紹介した抽象クラスと同様にインスタンス化はできません。また宣言時はclassではなくinterfaceキーワードを使用します。
【構文】
[修飾子] interface インターフェイス名 { }
(例)
public interface MyInterface { }
インターフェイスに定義するメソッドは抽象メソッドのみです。処理内容を持つ通常のメソッドは定義できません。抽象メソッドの構文は抽象クラスのときと同様ですが、インターフェイスの場合は、使用できるアクセス修飾子はpublicのみです。インターフェイスで宣言したメソッドは、publicなabstractメソッドであることが決まっているため、明示的にpublic abstractを指定していなくても、コンパイラによって強制的に付加されます。
ソースファイル | ||
|
protected はコンパイルエラー | |
↓ |
||
|
||
↓ |
||
クラスファイルの中のイメージ | ||
|
暗黙で public abstract になる | |
図1 インターフェイスでのメソッドの例 |
インターフェイスに定義できる変数はpublicなstatic指定されたfinalな変数、つまり定数のみです。もし明示的にpublic static finalを指定していなくても、コンパイラによって強制的に付加されます。このようにインターフェイスでは必ず定数となるため、初期化しておかないとコンパイルエラーとなります。
ソースファイル | ||
|
aは初期化していないのでコンパイルエラー | |
↓ |
||
|
||
↓ |
||
クラスファイルの中のイメージ | ||
|
暗黙でpublic static finalになる | |
図2 インターフェイスでの変数の例 |
インターフェイス自体はインスタンス化できないため、インターフェイスで宣言されたメソッドをオーバーライドしたクラスを用意する必要があります。これをインターフェイスの実装クラスと呼びます。実装クラスの宣言時には、implementsキーワードを使用し、インターフェイス名を指定します。
【構文】
[修飾子] class クラス名 implements インターフェイス名{ }
(例)
public interface MyInterface { }
public class MyClass implements MyInterface { }
implementsの後には、1つ以上のインターフェイスを複数指定することができます。複数指定する場合は、カンマ(,)で区切ります。そして、その実装クラスは、インターフェイスで宣言されたメソッドをすべて実装する必要があります。また、オーバーライドする際には、public修飾子を付ける必要があります。
インターフェイス | |||
|
|
||
↑ implements |
|||
実装クラス | |||
|
|
図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. コンパイルエラー
Copyright © ITmedia, Inc. All Rights Reserved.