国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java的“多重繼承”

2019-11-18 12:07:50
字體:
來源:轉載
供稿:網友

  接口只是比抽象類“更純”的一種形式。它的用途并不止那些。由于接口根本沒有具體的實施細節——也就是說,沒有與存儲空間與“接口”關聯在一起——所以沒有任何辦法可以防止多個接口合并到一起。這一點是至關重要的,因為我們經常都需要表達這樣一個意思:“x從屬于a,也從屬于b,也從屬于c”。在C++中,將多個類合并到一起的行動稱作“多重繼續”,而且操作較為不便,因為每個類都可能有一套自己的實施細節。在java中,我們可采取同樣的行動,但只有其中一個類擁有具體的實施細節。所以在合并多個接口的時候,C++的問題不會在Java中重演。如下所示:
  
Java的“多重繼續”


  在一個衍生類中,我們并不一定要擁有一個抽象或具體(沒有抽象方法)的基礎類。假如確實想從一個非接口繼續,那么只能從一個繼續。剩余的所有基本元素都必須是“接口”。我們將所有接口名置于implements要害字的后面,并用逗號分隔它們。可根據需要使用多個接口,而且每個接口都會成為一個獨立的類型,可對其進行上溯造型。下面這個例子展示了一個“具體”類同幾個接口合并的情況,它最終生成了一個新類:
  
  //: Adventure.java
  // Multiple interfaces
  import java.util.*;
  
  interface CanFight {
   void fight();
  }
  
  interface CanSwim {
   void swim();
  }
  
  interface CanFly {
   void fly();
  }
  
  class ActionCharacter {
   public void fight() {}
  }
  
  class Hero extends ActionCharacter
  implements CanFight, CanSwim, CanFly {
   public void swim() {}
   public void fly() {}
  }
  
  public class Adventure {
   static void t(CanFight x) { x.fight(); }
   static void u(CanSwim x) { x.swim(); }
   static void v(CanFly x) { x.fly(); }
   static void w(ActionCharacter x) { x.fight(); }
   public static void main(String[] args) {
  Hero i = new Hero();
  t(i); // Treat it as a CanFight
  u(i); // Treat it as a CanSwim
  v(i); // Treat it as a CanFly
  w(i); // Treat it as an ActionCharacter
   }
  } ///:~
  
  從中可以看到,Hero將具體類ActionCharacter同接口CanFight,CanSwim以及CanFly合并起來。按這種形式合并一個具體類與接口的時候,具體類必須首先出現,然后才是接口(否則編譯器會報錯)。
  
  請注重fight()的簽名在CanFight接口與ActionCharacter類中是相同的,而且沒有在Hero中為fight()提供一個具體的定義。接口的規則是:我們可以從它繼續(稍后就會看到),但這樣得到的將是另一個接口。假如想創建新類型的一個對象,它就必須是已提供所有定義的一個類。盡管Hero沒有為fight()明確地提供一個定義,但定義是隨同ActionCharacter來的,所以這個定義會自動提供,我們可以創建Hero的對象。
  
  在類Adventure中,我們可看到共有四個方法,它們將不同的接口和具體類作為自己的自變量使用。創建一個Hero對象后,它可以傳遞給這些方法中的任何一個。這意味著它們會依次上溯造型到每一個接口。由于接口是用Java設計的,所以這樣做不會有任何問題,而且程序員不必對此加以任何非凡的關注。
  
  注重上述例子已向我們揭示了接口最要害的作用,也是使用接口最重要的一個原因:能上溯造型至多個基礎類。使用接口的第二個原因與使用抽象基礎類的原因是一樣的:防止客戶程序員制作這個類的一個對象,以及規定它僅僅是一個接口。這樣便帶來了一個問題:到底應該使用一個接口還是一個抽象類呢?若使用接口,我們可以同時獲得抽象類以及接口的好處。所以假如想創建的基礎類沒有任何方法定義或者成員變量,那么無論如何都愿意使用接口,而不要選擇抽象類。事實上,假如事先知道某種東西會成為基礎類,那么第一個選擇就是把它變成一個接口。只有在必須使用方法定義或者成員變量的時候,才應考慮采用抽象類。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广宁县| 周至县| 沙田区| 长子县| 惠东县| 枝江市| 南开区| 尼勒克县| 清涧县| 金溪县| 盐池县| 乌拉特中旗| 古丈县| 万安县| 门源| 尼勒克县| 天等县| 荣昌县| 井冈山市| 洞头县| 蓝田县| 南汇区| 木里| 彰武县| 安化县| 崇礼县| 宁阳县| 西林县| 山东| 新干县| 通河县| 鹤岗市| 石台县| 明光市| 辉南县| 个旧市| 高阳县| 屏边| 临江市| 昌图县| 广平县|