Board logo

標題: 介面 (一) [打印本頁]

作者: 許婷芳    時間: 2020-5-30 16:07     標題: 介面 (一)

本帖最後由 許婷芳 於 2020-5-30 16:26 編輯

介面(Interface)是一種特殊的類別,在宣告時不是使用class而是改用interface,但在編譯後也會產生.class檔。介面只有宣告而沒有實作,架構上與抽象類別有點類似,用法與限制卻大不相同。

在Java中,類別並不允許多重繼承,但允許實作多個介面,而在介面繼承時,也允許繼承多個父介面,我們利用這兩種機制來模擬多重繼承。

我們可以把介面想像成物件與外界溝通的橋樑,或物件欲扮演的角色。通常我們使用介面來描述不同類別的物件間,共通的行為或特性。譬如:有個介面叫父親,把這個介面套用在小貓、小鳥、還是人類身上,就能使該物件開始扮演父親的角色,執行照顧子女的任務。

關於介面的幾個重點歸納如下:

1. 介面中的成員變數必須利用關鍵字final宣告為常數,並指定初始值。
2. 介面中的成員方法必須宣告為抽象方法,不能有方法主體。
3. 由於編譯器會自動將介面中的成員變數宣告為public、static與final,因此是常數變數,同時關鍵字可以省略。
4. 由於編譯器會自動將介面中的成員方法宣告為public與abstract,因此是抽象方法,同時關鍵字可以省略。
5. 類別可繼承一個類別但可實作多個介面。
6. 介面不能實作另一個介面但可繼承多個介面。
7. 實作介面的類別可以新增成員變數與成員方法,但一定要定義介面中所有抽象方法的內容,同時因為介面中的成員方法存取權限都是public,所以在這邊定義成員方法時,也必須加上public,否則會編譯錯誤。



[設計導引]

1. 定義抽象類別 Animal, 該類別包含了
    兩個屬性成員: age 與 w
    建構子
    兩個抽象方法: eat(double x) 與 showProfile()
2. 定義一般類別 Human 繼承 Animal, 在該類別中新增
    一個屬性成員: name
    建構子
    實作自父類別繼承下來的兩個抽象方法: eat(double x) 與 showProfile()
3. 定義三個介面: Swimmer, Singer, Father
    分別包含了常數變數 LEVEL="專業級" 或 "新手級" 等
    以及 swim(double x), sing(String song), takeCare() 等抽象方法
4. 讓類別 Human 實作 Swimmer, Singer, Father 這三個介面
    並實作所有抽象方法: swim(double x), sing(String song), takeCare()
5. 在 Human 類別下新增一物件, 並利用該物件帶出所有方法, 如執行畫面所示
  1. public class Ch72 {
  2.         public static void main(String[] args) {
  3.                 Human h1=new Human("湯尼",35,70);
  4.                 h1.showProfile();
  5.                 h1.eat(0.85);
  6.                 h1.showProfile();
  7.                 h1.swim(1500);
  8.                 h1.sing("新不了情");
  9.                 h1.takeCare();
  10.         }
  11. }

  12. abstract class Animal
  13. {
  14.     ...
  15. }

  16. interface Swimmer
  17. {
  18.     ...
  19. }

  20. interface Singer
  21. {
  22.     ...
  23. }

  24. interface Father
  25. {
  26.     ...
  27. }

  28. class Human extends Animal implements Swimmer, Singer, Father
  29. {
  30.     String name;
  31.     Human(String n,int a,double w)
  32.     {
  33.             ...
  34.     }
  35.     void showProfile()
  36.     {
  37.             ...
  38.     }
  39.     void eat(double x)
  40.     {
  41.             ...
  42.     }
  43.     public void swim(double x)
  44.     {
  45.             ...
  46.     }
  47.     public void sing(String x)
  48.     {
  49.             ...
  50.     }
  51.     public void takeCare()
  52.     {
  53.             ...
  54.     }   
  55. }
複製代碼

作者: 蔡季庭    時間: 2020-5-30 17:32

此帖僅作者可見
作者: 戴偉宸    時間: 2020-5-30 17:35

此帖僅作者可見
作者: 蔡依宸    時間: 2020-5-30 17:35

此帖僅作者可見
作者: 宋威廷    時間: 2020-5-30 17:36

此帖僅作者可見
作者: 陳智鈞    時間: 2020-5-30 17:37

此帖僅作者可見
作者: 陳柏霖    時間: 2020-5-30 17:39

此帖僅作者可見
作者: 洪藜芸    時間: 2020-5-30 17:42

此帖僅作者可見
作者: 陳柏銓    時間: 2020-5-30 17:43

此帖僅作者可見
作者: 許婷芳    時間: 2020-5-30 17:50

此帖僅作者可見
作者: 蔡季庭    時間: 2020-6-6 16:33

此帖僅作者可見
作者: 洪子涵    時間: 2020-6-6 17:18

此帖僅作者可見




歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://istak.org.tw/seed/) Powered by Discuz! 7.2