返回列表 發帖

介面 (一)

介面(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 A {

  2.         public static void main(String[] args) {
  3.                 Human h=new Human("湯尼",35,70);
  4.                 h.showProfile();
  5.                 h.eat(0.85);
  6.                 h.showProfile();
  7.                 h.swim(1500);
  8.                 h.sing("新不了情");
  9.                 h.takeCare();
  10.         }

  11. }
  12. abstract class Animal{
  13.         int age;
  14.         double w;
  15.         Animal(int a,double w){
  16.                 age=a;
  17.                 this.w=w;
  18.         }
  19.         abstract void eat(double x);
  20.         abstract void showProfile();
  21. }
  22. interface Swimmer{
  23.         String LEVEL="專業級";
  24.         void swim(double x);
  25. }
  26. interface Singer{
  27.         String LEVEL="專業級";
  28.         void sing(String song);
  29. }
  30. interface Father{
  31.         String LEVEL="新手級";
  32.         void takeCare();
  33. }
  34. class Human extends Animal implements Swimmer, Singer, Father{
  35.         String name;
  36.         Human(String n,int a,double w){
  37.                 super(a, w);
  38.                 name=n;
  39.         }
  40.         @Override
  41.         void eat(double x) {
  42.                 System.out.println(name+"咕嚕咕嚕吃下了"+x+"公斤的食物。");
  43.                 w=w+x;
  44.         }
  45.         @Override
  46.         void showProfile() {
  47.                 System.out.println(name+"今年"+age+"歲,體重"+w+"公斤。");
  48.                
  49.         }
  50.         @Override
  51.         public void takeCare() {
  52.                 System.out.println(name+"以"+Father.LEVEL+"水準,開始扮演父親的角色,照顧小孩。");
  53.         }
  54.         @Override
  55.         public void sing(String song) {
  56.                 System.out.println(name+"以"+Singer.LEVEL+"水準,唱了一首"+song+"。");       
  57.         }
  58.         @Override
  59.         public void swim(double x) {
  60.                 System.out.println(name+"以"+Swimmer.LEVEL+"水準,刷刷刷快速地游了"+x+"公尺。");
  61.         }
  62. }
複製代碼

TOP

  1. public class CH01{
  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(100);
  8.                 h1.sing("蝴蝶");
  9.                 h1.takeCare();
  10.         }
  11. }

  12. abstract class Animal
  13. {
  14.     int age;
  15.     double w;
  16.     Animal(int a,double w)
  17.     {
  18.             age=a;
  19.             this.w=w;
  20.     }
  21.     abstract void eat(double x);
  22.     abstract void showProfile();
  23. }

  24. interface Swimmer
  25. {
  26.     String LEVEL="專業級";
  27.     void swim(double x);
  28. }

  29. interface Singer
  30. {
  31.     String LEVEL="專業級";
  32.     void sing(String x);
  33. }

  34. interface Father
  35. {
  36.     String LEVEL="新手級";
  37.     void takeCare();
  38. }

  39. class Human extends Animal implements Swimmer, Singer, Father
  40. {
  41.     String name;
  42.     Human(String n,int a,double w)
  43.     {
  44.             super(a,w);
  45.             name=n;
  46.     }
  47.     void showProfile()
  48.     {
  49.             System.out.println(name+"今年"+age+"歲,體重"+w+"公斤.");
  50.     }
  51.     void eat(double x)
  52.     {
  53.         System.out.println(name+"咕嚕咕嚕吃下了"+x+"公斤的食物.");
  54.         w+=x;
  55.     }
  56.     public void swim(double x)
  57.     {
  58.             System.out.println(name+"以"+Swimmer.LEVEL+"水準,刷刷刷快速游了"+x+"公尺.");
  59.     }
  60.     public void sing(String x)
  61.     {
  62.             System.out.println(name+"以"+Singer.LEVEL+"水準,唱了一首"+x+".");
  63.     }
  64.     public void takeCare()
  65.     {
  66.             System.out.println(name+"以"+Father.LEVEL+"水準,開始扮演父親的角色,照顧小孩.");
  67.     }   
  68. }
複製代碼

TOP

  1. public class Ch01 {

  2.         public static void main(String[] args) {
  3.                 Human h=new Human("湯尼",35,70);
  4.                 h.showProfile();
  5.                 h.eat(0.85);
  6.         h.showProfile();
  7.         h.sing("蝴蝶");
  8.         h.swim(100);
  9.         h.takeCare();
  10.         }

  11. }
  12. abstract class Animal
  13. {
  14.         int age;
  15.         double w;
  16.         Animal(int a, double w){
  17.                 age=a;
  18.                 this.w=w;
  19.         }
  20.         abstract void eat(double x);
  21.         abstract void showProfile();
  22. }

  23. interface Swimmer
  24. {
  25.         String LEVEL="專業級";
  26.         void swim(double x);
  27. }
  28. interface Singer
  29. {
  30.         String LEVEL="專業級";
  31.         void sing(String song);
  32. }
  33. interface Father
  34. {
  35.         String LEVEL="新手級";
  36.         void takeCare();
  37. }

  38. class Human extends Animal implements Swimmer,Singer,Father
  39. {
  40.         String name;
  41.         Human(String n,int a,double w)
  42.         {
  43.                 super(a,w);
  44.                 name=n;
  45.         }
  46.         @Override
  47.         void eat(double x) {
  48.                 System.out.println(name+"咕嚕咕嚕吃下"+x+"公斤的食物。");
  49.                 w+=x;
  50.         }
  51.         @Override
  52.         void showProfile() {
  53.                 System.out.println(name+"今年"+age+"歲,體重"+w+"公斤。");
  54.         }
  55.         @Override
  56.         public void takeCare() {
  57.                 System.out.println(name+"以"+Father.LEVEL+"水準扮演父親的角色,照顧小孩。");
  58.         }
  59.         @Override
  60.         public void sing(String song) {
  61.                 System.out.println(name+"以"+Singer.LEVEL+"水準唱了一首"+song+"。");
  62.         }
  63.         @Override
  64.         public void swim(double x) {
  65.                 System.out.println(name+"以"+Swimmer.LEVEL+"水準游了"+x+"公尺");
  66.         }
  67.        
  68. }
複製代碼

TOP

返回列表