―Javaプログラミングの前提知識―

@ITハイブックス編
2003/2/27
Javaプログラミング
ワンポイントレクチャーについて

   インターフェイスとは

   ワンポイントQuestion

 以下のようなソースコードがあります。

public interface DefAction {
  void doStart();
  void doStop();
}
public interface SubAction extends DefAction {
  void doLoop();
}
public interface ActionMark { }

 次の説明のうち、誤っているものはどれですか? (複数選択)

A public class MyAction implements DefAction, ActionMark { } とクラス宣言できる
B public class MyAction extends DefAction { } とクラス宣言できる
C MyActionクラスがDefActionを実装する場合、DefAction act = new MyAction();とすることができる
D SubActionを実装するクラスは必ずdoStart(), doStop(), doLoop()メソ ッドを実装しなければならない
E 上記ソースコードをコンパイルすると、DefAction.inter、SubAction.inter、ActionMart.interと3つのファイルが生成される


   配列の宣言方法

インタフェースとはクラス定義の雛型として使用するものです。その中には定数とメソッドを定義できますが、メソッドには処理の実装がされません。 インタフェースの定義はキーワード「interface」を使用して次のようになります。

interface インタフェース名 {
  定数;
  メソッド;
}

インタフェース宣言ではクラス宣言と同じく、変数やメソッドを定義します。またパッケージ化することもできるので、別パッケージから利用したい場合はクラス定義と同様にpublic指定しておきます。

 しかし、正確には以下のような点でクラスとは異なります。

  • キーワード「interface」を使って宣言します。
  • インタフェース内のフィールドは必ず定数とします。
  • インタフェース内のメソッドは処理を記述しません。
  • インタフェースからインスタンスは作成できません。

例)
public interface MyInterface {
String str = "Hello";
void start();
void stop();
}

また、クラスと同様にインタフェースを派生した別のインタフェースを作成することも可能です。

例)
public interface SubInterface extends MyInterface {
  void play();
}

インタフェースからオブジェクトを作成することはできません。上記例の続きで

MyInterface my = new MyInterface();

とするとコンパイルエラーになります。

 インタフェースはクラスに実装して使用します。クラスに実装する場合、キーワード「implements」を使用して次のようになります。

class クラス名 implements インタフェース名 { // クラス定義 }

例)
public class MyClass implements MyInterface {
  void start() { //startの処理 }
  void stop() { //stopの処理 }
}

 インタフェースを実装したクラスは、インタフェースに宣言されている全メソッドを必ずクラス定義に含めなくてはいけません(上の例のstart()、stop())。

 また、1つのクラスに対して複数のインタフェースを実装することもできます。

例)
public class MyClass implements MyInterface, OtherInterface { // クラス定義 }

 このことから、インタフェースを実装したクラスは、インタフェースに宣言されたメソッドや変数を必ずもつことになります。また、別クラスでも同じインタフェースを実装している場合は、それぞれのクラスに同じメソッド、変数が存在することになります。

  そのため、同じインタフェースを実装したすべてのクラスには、必要なメソッドや変数が定義されていると保証されることになります。

 システムの規模が大きくなった場合などにインタフェースを使うと、仕様の統一をはかることができます。

 本設問の選択肢Bで、DefActionはインタフェースなのでextends指定ではありません。また、インタフェースそのものをnewすることはできませんが、インタフェースの変数にそのインタフェースを実装したクラスのオブジェクトを代入することは可能なので、選択肢Cは正しい説明です。

POINT

●public指定されたインタフェース内では、暗黙的に定数はpublic static final、メソッドはpublic abstractとなります。
●インタフェースのソースファイル名も拡張子.javaがつき、コンパイルすると拡張子.classがつくファイルが生成されます。
●インタフェースは抽象クラス(abstractクラス)の概念をさらに抽象化した概念です。
● 代表的なインタフェースには、次のようなものがあります。

java.lang.Runnableインタフェース スレッド処理時に使用します
java.awt.event.ActionListenerインタフェース イベント処理時に使用します
java.io.Serializableインタフェース シリアライゼーションしたいクラスに実装するインタフェースです。マーカインタフェースのためメソッドは定義されていません

KEYWORD

■派生
既存のクラス、インタフェースを継承した別のクラスやインタフェースを作成することを派生とよびます。

■マーカインタフェース
インタフェース宣言だけで、実際の定義は空になっているインタフェースをいいます。印付けとして使用するインタフェースです。


   ワンポイントQuestionの解答

正解 B、E

Java2ラーニングブック −310-035 編−

本記事は@ITハイブックスシリーズ「Java2ラーニングブック −310-035 編−」(技術評論社)から、一部の内容を編集し転載したものです。本書の詳細は「@ITハイブックス」サイトでご覧いただけます。

 

Javaプログラミング・ワンポイントレクチャー INDEX





Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間