ETH官方钱包

切換
舊版
前往
大廳
主題

Java Programming Lesson 14

ジャネス | 2011-09-10 10:35:38 | 巴幣 0 | 人氣 579


Java言語プログラミングレッスン下巻

第14章:インタフェース
。インタフェースとは何か
 。インタフェースとは何か
 。インタフェースの「実裝」
 。extendsとimplement の違い
 。例:DebugPrintableインタフェース
 。インタフェース型の変數
 。配列でインタフェースを利用する
 。メソッドの引數でインタフェースを利用する
 。インタフェースのフィールド
 。インタフェースの中でenumを宣言する
 。スーパーインタフェース
 。多重継承とインタフェース
。クラスとインタフェースの比較
。練習問題

★★★★★

。インタフェースとは何か
 。インタフェースとは何か
  。クラスとインタフェースはとてもよく似ています
   ------------------------------
  。相似點     クラス           インタフェース
   ------------------------------
   型       參照型           參照型
   名前      持つ            持つ
   フィールド   持つ            持つ
   メソッド    持つ            持つ
   階層親分    スーパークラス       スーパーインタフェース
   階層子分    サブクラス         サブインタフェース
   ------------------------------
  。相違點     クラス           インタフェース
   ------------------------------
   予約語     subclass extends      class implements
            (superclass)        (interface)
                         subinterface extends
                         (super interface)
   継承      単一継承          多重継承
   インスタンス  作れる           作れない
   メソッド    いろいろ(抽象、具象)   抽象だけ、必ずpublic abstract
   フィールド   いろいろ(定數、変數)   定數だけ、必ずpublic static final
   スーパークラス 1つだけ          持ってない
   スーパー    複數指定可能        複數指定可能
   インタフェース (implementsを使う)    (extendsを使う)
           class A implements B, C { interface X extends X, Z {
             ...            ...
           }             }
   ------------------------------
  。例
  interface Lockable {
    boolean lock();
    boolean unlock();
  }
  。インタフェースの中に
   。抽象メソッドだけ宣言できる
   。{}があるメソッドを宣言できない
 。インタフェースの「実裝」
  。implementsを使います
  。例 Lockableインタフェースを実裝したKinkoクラスの宣言
  class Kindo implements Lockable {
    public boolean lock() {
      ...
    }
    public boolean unlock() {
       ...
    }
  }
 。extendsとimplement の違い
  。クラス階層図
   Object
   -- Kinko (extendsなし)
   -- Box
     -- JewelBox
      -- LockableJewelBox (extends JewelBox )
  。例
  class LockableJewelBox extends JewelBox implements Lockable {
    public boolean lock() {
      ...
    }
    public boolean unlock() {
      ...
    }
  }
 。例:DebugPrintableインタフェース

DebugPrintable.java
----------
interface DebugPrintable {
  void debugPrint();
}
----------
実行結果
javac DebugPrintable.java
java DebugPrintable

----------

MyNumber.java(DebugPrintableインタフェースを実裝する)
----------
class MyNumber implements DebugPrintable {
  int a;
  public MyNumber(int a) {
    this.a = a;
  }
  public void debugPrint() {
    System.out.println("MyNumberのインタフェース:aの値は " + a + "です。");
  }
  public static void main(String[] args) {
    MyNumber num = new MyNumber(123);
    num.debugPrint();
  }
}
----------
実行結果
javac MyNumber.java
java MyNumber
MyNumberのインタフェース:aの値は 123です。
----------

MyFileReader.java
----------
import java.io.*;

  class MyFileReader extends FileReader implements DebugPrintable {
    String filename = null;
    public MyfileReader(String filename) throws FileNotFoundException {
      super(filename);
      this.filename = filename;
    }
    public void debugPrint() {
      System.out.print("MyFileReaderのインタフェース:ファイル名は" + filename + "です。");
    }
  }
----------
実行結果
javac MyFileReader.java
java MyFileReader

----------

  MyNumberとMyFileReaderを含むクラス階層図
  Object
  -- MyNumber
  -- Reader
    -- InputStreamerReader
     -- FileReader
       -- MyFileReader

 。インタフェース型の変數
  。インタフェースはインタフェースを作れない
   × DebugPrintable obj = new DebugPrintable();
  。インタフェース型の変數を使える
   ○ DebugPrintable obj = new MyNumber(123);
   ○ Debugprintable obj = new MyFileReader("input.txt");
  。変數objと呼び出すことができる
   ○ obj.debugPrint();
  。つぎのように呼び出すことができない
   × obj.read();
  。キャスト(cast)する必要がある
   ○ ((MyFileReader)obj).read()
 。配列でインタフェースを利用する
  。例
   DebugPrintable[] objs = new DebugPrintable[2];

   objs[0] = new MyNumber(123);
   objs[1] = new MyFileReader("input.txt");

   for (int i = 0; i < objs.length; i++) {
     objs[i].debugPrint();
   }
 。メソッドの引數でインタフェースを利用する
  class MyInspector {
    static void inspect(DebugPrintable obj) {
      obj.debugPrint();
    }
  }

      MyInspector.inspect(obj);
 。インタフェースのフィールド
  interface DebugPrintable {
    int NO_ERROR = 0;     エラーが起きていないことを表すintの定數
    int FILE_READER = 1;    ファイル関係のエラーを表すintの定數
    int MEMORY_ERROR = 2;   メモリ関係のエラーを表すintの定數
    String PREFIX = "ERROR:"; エラーメッセージを出すときに前に付ける文字列
    void debugPrint();    
  }
  インタフェースで宣言されたフィールドは自動的にpublic static finalになる
  interface DebugPrintable {
    public static final int NO_ERROR = 0;
    public static final int FILE_READER = 1;
    public static final int MEMORY_ERROR = 2;
    public static final int PREFIX = "ERROR:";
    void debugPrint();
  }
  參照するときに、インタフェース名.フィールド名、例えば
  if (err == DebugPrintable.FILE_ERROR) {
    System.out.println(DebugPrintable.PREFIX + "ファイル関連のエラーです。");
  }
  実裝したメソッドの中で
  if (err == FILE_ERROR) {
    System.out.println(PREFIX + "ファイル関連のエラーです。");
  }
  インタフェースフィールド:public static final
  インタフェースメソッド :public abstract
 。インタフェースの中でenumを宣言する
  interface DebugPrintable {
    enum Type {
      NO_ERROR, FILE_ERROR, MEMORY_ERROR,
    };
    String PREFIX = "ERROR:";
    void debugPrint();
  }
 。スーパーインタフェース
  interface FastRunnable extends Runnable {
    void fastrun();
  }
  インタフェースの宣言
  interface インタフェース名 extends スーパーインタフェース
    型名 フィールド名 = 定數;
    型名 フィールド名 = 定數;
    型名 フィールド名 = 定數;
    型名 メソッド名 = 引數列;
    型名 メソッド名 = 引數列;
    型名 メソッド名 = 引數列;
  }
 。多重継承とインタフェース
  例
  interface MyReadable {
    void read(byte[] data);
  }

  interface MyWritable {
    void write(byte[] data);
  }

  class MyReaderWriterClass extends MyMediaClass implements MyReadable, MyWritable {
    public void read(byte[] data) {
      ...
    }
    public void write(byte[] data) {
      ...
    }
  }

★★★★★

。練習問題

問題14-1
正しいものに○、誤っているものに×
○ (1) インタフェースのインスタンスを作ることはできません
× (2) インタフェース型の変數を作ることはできません
    インタフェース型の変數を作ることはできる
× (3) インタフェースを宣言するにはinterfaseという予約語を使います
    interfaseではなく、interfaceです
× (4) インタフェースを実裝するクラスを宣言するにはextendsという予約語を使います
    extendsではなく、implementsです
× (5) インタフェースで宣言されているメソッドは、本體を持つことも持たないこともあります
    常に本體を持ちません
○ (6) インタフェースで宣言されているフィールドに代入することはできません
× (7) 1つのインタフェースの実裝クラスは必ず1つです
    そんなことはありません

問題14-2
クラスAlphaをスーパークラスに持ち、インタフェースBetaとGammaを実裝したpublicなクラスDeltaの宣言を書いてください。クラスの內容は省略してかまいません。

答え
public class Delta extends Alpha implements Beta, Gamma {
//省略
}

問題14-3
次のメソッドとフィールドを持つ、IconInfoというpublicなインタフェースを宣言してください。
?引數はint型で仮引數の名前はiconType、戻り値の型はImage型で、名前がgetIconであるメソッド
?型はintで名前はICON_16x16、値は1であるフィールド
?型はintで名前はICON_32x32、値は2であるフィールド

interface IconInfo {
  image getIcon(int iconType());
  int ICON_16x16;
  int ICON_32x32;
}

問題14-4
以下のMyMediaPlayableインタフェースを拡張して、MySoundPlayableという名前のサブインタフェースを宣言してください。追加するメソッドは以下のgetSoundNameです。

String getSoundName();

interface MyMediaPlayer {
  void play();
  void stop();
  loop();
}

interface MySoundPlayable extends MyMediaPlayer {
  String getSoundName();
}

問題14-5
抽象クラスとインタフェースの類似點と相違點を述べてください。

類似點    抽象クラス        インタフェース
名前     持ってる          持ってる
フィールド  本體がない         本體がない
メソッド   本體がない         本體がない
インスタンス 作れない          作れない
したの階層に メソッドの実裝要請     メソッドの実裝要請

相違點    抽象クラス         インタフェース
階層     クラス階層1つだけ     クラス階層いろいろ
メソッド   抽象メソッド少なくとも1つ すべて抽象メソッド
フィールド  定數でなくてもいい     すべて定數       

★★★★★

第14章 終わり

創作回應

相關創作

更多創作