亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

面向對象思想之 -- 繼承以及多態

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

  在"OOP簡介:理解類和對象"這篇文章中,我們討論了繼續和多態性的好處.我們還粗略的學習了如何擴展基類定義子類,繼續基類中合適的行為和屬性而重載那些并不適合的行為和屬性.這種方式能夠削減代碼宏余以及錯誤的堆積.
  
  現在我們將更深入的考察多重繼續性以及java是如何處理它的.我們還將通過學習動態綁定來學習多態性.
  
  深入繼續性
  一些面向對象的語言提供叫做"多重繼續"的特點,當一個對象需要從多于一個的基類繼續行為和屬性的時候這是有價值的.多重繼續在有些情況下是復雜的.例如,假設我們需要定義一個基類,Animal,然后是Animal的兩個子類,LandAnimal 和 WaterAnimal.現在我們想要定義一個類來代表青蛙.青蛙是兩棲動物,所以我們自然會想到定義Frog類從LandAnimal和WaterAnimal類繼續.這使得Frog類能夠同時從LandAnimal 和WaterAnimal類繼續所需的行為和屬性.
  
  初看起來這是相當簡單的;但是,讓我們為Animal添加一個叫做LivingEnvironment的屬性,并用方法getLivingEnvironment來返回它.我們假設LandAnimal 和 WaterAnimal類都重載了這個方法來實現非凡的功能.LandAnimal將返回Land作為它的LivingEnvironment屬性的值,而WaterAnimal將返回Water作為它的LivingEnvironment屬性的值.現在,當我們將Frog類作為LandAnimal 和 WaterAnimal 子類實現的時候,想要得到Frog的LivingEnvironment屬性值,這時將碰到一個麻煩:Frog類的getLivingEnvironment方法是返回Land值呢還是Water值?答案取決于編譯器如何處理多重繼續.
  
  我在前面的文章里就已經說過,Java不支持多重繼續.但它確實答應一個對象通過使用叫做"接口"的功能擁有多個特性.下面的例子顯示了定義LandAnimal的接口的可能的定義代碼:
  public interface LandAnimal
  {
    public int getNumberOfLegs();
    public boolean hasATail();
  }
  
  一個使用接口的類在類定義語句的開始添加implements+接口名.例如,在Java中,我們會以下面的方式定義Frog類:
  
  public class Frog extends Animal implements LandAnimal, WaterAnimal
  
  接口并沒有什么實際的功能;相反,它的作用是聯系使用者和實現了這個接口的對象.接口保證了對象實現接口定義的方法.而且,一個實現接口的對象能夠在運行時被強制轉換成接口類型.例如,使用上面的Frog定義,并且假設LandAnimal類定義了一個叫做getNumberOfLegs的方法而WaterAnimal定義了一個叫做hasGills的方法,那么一個Frog類的實例可以在運行時被強制轉換成LandAnimal或WaterAnimal對象:
  
  Frog aFrog = new Frog();
  int legCount = ((LandAnimal)aFrog).getNumberOfLegs();
  Boolean gillFlag = ((WaterAnimal)aFrog).hasGills();
  
  注重Forg為什么能夠被強制轉換成一個LandAnimal對象即使實際的LandAnimal對象并沒有被創建.這使得我們能夠在運行時以其帶有的任何"身份"調用一個對象,這就是所謂的"動態綁定"或"運行時綁定".
  
  深入多態性
  Java使用動態綁定來使多態成為可能,它指的是Java用來在運行時選擇調用的方法或對象的機制.重載構成了了Java中的一種非凡的多態機制,它表現在當一個類的兩個或者兩個以上的方法擁有相同的名字但是不同的參數列表,或者說"方法簽名".一個方法的簽名指的是方法的名字以及參數的類型和數目.類的每一個方法都有與之相關的唯一的簽名.類可以有多個名字相同的方法只要它們的參數列表是唯一的.例如,我們能夠為Animal類定義兩個名字為getHello的方法,用其中一個方法來獲得動物通常的叫聲,而用另一個獲得當動物被驚嚇或是撫摩的時候的叫聲.我們將給每一個方法唯一的簽名:
  
  public String getHello();
  public String getHello(int mood);
  
  現在,讓我們修改例子程序來將我們討論的一些概念付諸實踐:
   
  public class HelloWorld
  {
  public static void main(String[] args)
  {
  Dog animal1 = new Dog();
  Cat animal2 = new Cat();
  DUCk animal3 = new Duck();
  
  System.out.  +", when scared says: " +animal1.getHello(Animal.SCARED)
  +", is carnivorous: " +animal1.isCarnivorous()
  +", is a mammal: " +animal1.isAMammal());
  System.out.println("A cat says " +animal2.getHello()
  +", when comforted says: " +animal2.getHello(Animal.COMFORTED)
  +", is carnivorous: " +animal2.isCarnivorous()
  +", is a mammal: " +animal2.isAMammal());
  System.out.println("A duck says " +animal3.getHello()
  +", when scared says: " +animal3.getHello(Animal.SCARED)
  +", is carnivorous: " +animal3.isCarnivorous()
  +", is a mammal: " +animal3.isAMammal());
  }
  }
  
  abstract class Animal
  {
  public static final int SCARED = 1;
  public static final int COMFORTED = 2;
  
  public boolean isAMammal()
  {
  return(true);
  }
  
  public boolean isCarnivorous()
  {
  return(true);
  }
  
  abstract public String getHello();
  abstract public String getHello(int mood);
  }
  
  interface LandAnimal
  {
  public int getNumberOfLegs();
  public boolean hasATail();
  }
  
  interface WaterAnimal
  {
  public boolean hasGills();
  public boolean laysEggs();
  }
  
  class Dog extends Animal implements LandAnimal
  {
  // 重載父類的方法
  public String getHello()
  {
  return("Bark");
  }
  
  public String getHello(int mood)
  {
  switch (mood) {
  case SCARED:
  return("Growl");
  case COMFORTED:
  return("");
  }
  
  return("Bark");
  }
  
  // LandAnimal 接口的實現
  public int getNumberOfLegs()
  {
  return(4);
  }
  
  public boolean hasATail()
  {
  return(true);
  }
  }
  
  class Cat extends Animal implements LandAnimal
  {
  // 重載父類的方法
  public String getHello()
  {
  return("Meow");
  }
  
  public String getHello(int mood)
  {
  switch (mood) {
  case SCARED:
  return("Hiss");
  case COMFORTED:
  return("Purr");
  }
  
  return("Meow");
  }
  
  // LandAnimal 接口實現
  public int getNumberOfLegs()
  {
  return(4);
  }
  
  public boolean hasATail()
  {
  return(true);
  }
  }
  
  class Duck extends Animal implements LandAnimal, WaterAnimal
  {
  // 重載父類的方法
  public String getHello()
  {
  return("Quack");
  }
  
  public String getHello(int mood)
  {
  switch (mood) {
  case SCARED:
  return("Quack, Quack, Quack");
  case COMFORTED:
  return("");
  }
  
  return("Quack");
  }
  
  public boolean isAMammal()
  {
  return(false);
  }
  
  public boolean isCarnivorous()
  {
  return(false);
  }
  
  // WaterAnimal 接口實現
  public boolean hasGills()
  {
  return(false);
  }
  
  public boolean laysEggs()
  {
  return(true);
  }
  
  // LandAnimal 接口實現
  public int getNumberOfLegs()
  {
  return(2);
  }
  
  public boolean hasATail()
  {
  return(false);
  }
  }
  
  程序執行后輸出的結果如下:
  
  A dog says Bark, when scared says: Growl, is carnivorous: true, is a mammal: true
  A cat says Meow, when comforted says: Purr, is carnivorous: true, is a mammal: true
  A duck says Quack, when scared says: Quack, Quack, Quack, is carnivorous: false, is a mammal: false
  
  總結
  綜合繼續,多態和接口的概念提供了一組強大的編程工具,答應我們重用代碼,隔離錯誤的發生,并獲得動態/運行時綁定帶來的好處.在下一篇文章里,我們將討論如何使用Java的變量作用域/可見域規則來控制方法和屬性的暴露問題.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品亚洲片夜色在线| 久久精品青青大伊人av| 国产精品视频999| 精品国产乱码久久久久久天美| 一本色道久久综合亚洲精品小说| 91精品视频专区| 一区三区二区视频| 久久男人资源视频| 九九热最新视频//这里只有精品| 国产精品一区久久久| 亚洲福利影片在线| 日韩中文在线中文网在线观看| 欧美丝袜一区二区| 91wwwcom在线观看| 91久久精品久久国产性色也91| 久久九九免费视频| 亚洲一区二区免费| 成人黄色影片在线| 亚洲精品日产aⅴ| 91久久国产综合久久91精品网站| 国产成人精品视频在线| 日韩亚洲精品电影| 欧美日韩另类在线| 久久久久久亚洲精品不卡| 欧美一区深夜视频| 欧美特黄级在线| 亚洲色图国产精品| 成人妇女免费播放久久久| 欧美成人黑人xx视频免费观看| 麻豆精品精华液| 久久久久国产精品免费网站| 成人久久精品视频| 亚洲成人精品视频在线观看| 亚洲国产精品久久久久久| 久久精品久久精品亚洲人| 国产精品久久久久久av下载红粉| 国产亚洲精品高潮| 国产福利精品在线| 欧美午夜宅男影院在线观看| 97在线日本国产| 欧美黑人极品猛少妇色xxxxx| 欧美国产视频一区二区| 日韩精品视频在线播放| 精品国产一区二区三区在线观看| 欧美国产一区二区三区| 国产精品99蜜臀久久不卡二区| 成人久久久久久| 深夜福利亚洲导航| 日韩精品有码在线观看| 亚洲最大的网站| 欧美亚洲国产成人精品| 日韩欧美中文免费| 成人精品一区二区三区电影黑人| 97人人爽人人喊人人模波多| 国产精品va在线播放| 日韩av在线一区| 综合久久五月天| 亚洲欧美日韩一区二区三区在线| 国产精品com| 最新日韩中文字幕| 久久久久中文字幕| 国产精品小说在线| 成人中文字幕+乱码+中文字幕| 国产精品视频免费观看www| 国产成人亚洲综合青青| 91免费的视频在线播放| 中文字幕日韩av| 中文字幕国产亚洲2019| 亚洲精品电影在线观看| 久久福利视频导航| 欧美日韩国产页| 78m国产成人精品视频| 人人澡人人澡人人看欧美| 欧美最猛性xxxxx(亚洲精品)| 91在线精品视频| 久久精品久久久久| 国产人妖伪娘一区91| 日本韩国欧美精品大片卡二| www.久久草.com| 欧美韩日一区二区| 亚洲人成电影在线播放| 国产在线观看一区二区三区| 91精品视频在线播放| 久久天天躁日日躁| 欧美国产日韩中文字幕在线| 欧美精品videosex性欧美| 日韩av影视在线| 国产精品www网站| 亚洲国产成人久久| 岛国视频午夜一区免费在线观看| 国内精品久久久久伊人av| 中文字幕日韩有码| 国产精品久久久久久久久粉嫩av| 92看片淫黄大片看国产片| 亚洲成人教育av| 福利一区视频在线观看| 久久综合网hezyo| 久久伊人精品视频| 欧美另类老肥妇| 欧美一级大片在线免费观看| 日韩视频欧美视频| 亚洲电影免费观看高清完整版在线观看| 一区二区三区四区精品| 久久久视频在线| 日韩欧美中文第一页| 不卡av日日日| 亚洲欧美中文字幕在线一区| 日韩亚洲国产中文字幕| 91精品国产乱码久久久久久久久| 久久久久久国产精品三级玉女聊斋| 亚洲视频自拍偷拍| 91精品国产91久久久久| 国产精品成人国产乱一区| 91亚洲精品在线| 亚洲一区二区久久久久久久| 最近2019年中文视频免费在线观看| 日韩有码片在线观看| 清纯唯美日韩制服另类| 国产精品亚洲综合天堂夜夜| 综合av色偷偷网| 操人视频在线观看欧美| 成人做爽爽免费视频| 97婷婷涩涩精品一区| 91成品人片a无限观看| 日韩欧美a级成人黄色| 青草青草久热精品视频在线网站| 国产91精品高潮白浆喷水| 国产精品一区二区三区毛片淫片| 国产精品香蕉av| 国产精品爱啪在线线免费观看| 欧美亚洲在线视频| 欧美巨乳在线观看| 国产精品日日摸夜夜添夜夜av| 91久久在线观看| 日韩成人在线电影网| 中文字幕日本欧美| 欧美激情中文字幕在线| 在线观看成人黄色| 欧美激情精品久久久久久免费印度| 成人欧美一区二区三区在线湿哒哒| 日韩av免费网站| 亚洲免费伊人电影在线观看av| 国产欧洲精品视频| 亚洲精品一区中文字幕乱码| 777午夜精品福利在线观看| 成人高清视频观看www| 亚洲第一二三四五区| 国产玖玖精品视频| 久久久久久久电影一区| 欧美国产在线电影| 亚洲国产三级网| 亚洲美女av黄| 日韩一区二区久久久| 国产精品草莓在线免费观看| 麻豆一区二区在线观看| 亚洲第一视频网| 91久久精品国产| 国产精品视频1区| 日韩免费av在线| 欧美日韩综合视频网址| 国产精品免费一区| 日本欧美国产在线| 日韩美女中文字幕| 中文字幕亚洲一区二区三区|