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

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

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

2019-11-18 11:18:03
字體:
來源:轉載
供稿:網友

  在"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
日韩少妇与小伙激情| 日韩欧美在线网址| 亚洲人成人99网站| 亚洲成色www8888| 亚洲人成网在线播放| 国产精品 欧美在线| 久久亚洲精品视频| 97在线观看免费高清| 少妇高潮 亚洲精品| 日韩av一区在线观看| 国产欧美日韩精品丝袜高跟鞋| 国产成人综合久久| 91av在线播放| 日韩精品视频免费| 成人激情视频在线播放| 欧美俄罗斯性视频| 欧美午夜女人视频在线| 国产成人在线播放| 国产97在线播放| 色噜噜狠狠色综合网图区| 91性高湖久久久久久久久_久久99| 亚洲三级黄色在线观看| 国产精品pans私拍| 欧美一级视频一区二区| 一本色道久久综合亚洲精品小说| 国产精自产拍久久久久久蜜| 欧美日韩国产精品专区| 国产成人精品999| 国产精品午夜一区二区欲梦| xxav国产精品美女主播| 欧美黄色免费网站| 91九色单男在线观看| 欧美性xxxxhd| 中文字幕免费精品一区| 九九九热精品免费视频观看网站| 91精品中国老女人| 欧美激情乱人伦一区| 欧美电影《睫毛膏》| 欧美日韩亚洲91| 亚洲国产97在线精品一区| 久久成年人免费电影| 色阁综合伊人av| 操日韩av在线电影| 精品国产乱码久久久久酒店| 精品视频—区二区三区免费| 亚洲自拍另类欧美丝袜| 亚洲跨种族黑人xxx| 国产精品99久久久久久久久| 久久久久国产精品一区| 1769国内精品视频在线播放| 亚洲一区999| 狠狠躁夜夜躁久久躁别揉| 成人黄色免费看| 久久久久久免费精品| 日韩在线观看免费网站| 国产精品美女主播| 国模吧一区二区| 精品国产视频在线| 成人中心免费视频| 欧美一区二区三区精品电影| 欧美日韩中文字幕在线| 亚洲第一区中文字幕| 亚洲自拍偷拍视频| 在线观看国产精品日韩av| 亚洲人成电影网| 国产精品69精品一区二区三区| 一区二区三区视频在线| 97色在线观看| 久久天天躁夜夜躁狠狠躁2022| 色综合久综合久久综合久鬼88| 日韩在线一区二区三区免费视频| 欧美电影第一页| 亚洲人成网站777色婷婷| 久久久久成人精品| 亚洲高清久久久久久| 欧美日韩国产黄| 亚洲国产精品高清久久久| 日韩av在线免费观看一区| www欧美日韩| 久久综合亚洲社区| 久久久亚洲国产| 国产丝袜一区二区三区| 丝袜美腿亚洲一区二区| 欧美激情一级二级| 91久久精品日日躁夜夜躁国产| 久久色在线播放| 久久精品亚洲一区| 最近2019年日本中文免费字幕| 国产精品亚洲美女av网站| 亚洲精品小视频在线观看| 久久久久久久久久久久av| 色综合亚洲精品激情狠狠| 98精品国产高清在线xxxx天堂| 国模极品一区二区三区| 黄色一区二区在线| 精品自在线视频| 欧美性猛交xxxx乱大交3| 久久中文精品视频| 欧美亚洲伦理www| 国产中文字幕91| 国产精品久久久久久影视| 欧美亚洲午夜视频在线观看| 国产亚洲欧洲高清一区| 91成人性视频| 久久在线免费观看视频| 亚洲欧美日韩国产中文专区| 成人情趣片在线观看免费| 国产精品久久久久久久美男| 亚洲福利视频在线| 国模精品视频一区二区| 国产精品网红福利| 中文字幕一区电影| 日韩在线观看视频免费| 亚洲美女免费精品视频在线观看| 国产精品久久二区| 欧美日韩国产成人在线| 亚洲自拍av在线| 91精品国产高清自在线| 97视频免费在线观看| 国产拍精品一二三| 日韩中文字幕免费看| 欧美国产日本高清在线| 中文字幕精品一区久久久久| 综合136福利视频在线| 亚洲国产一区自拍| 欧洲精品在线视频| 正在播放欧美视频| 国产欧美精品va在线观看| 亚洲精品影视在线观看| 精品亚洲男同gayvideo网站| 欧美视频在线免费看| 日韩成人在线视频观看| 国产日韩欧美黄色| 亚洲女成人图区| 精品久久久久久中文字幕| 日韩欧美大尺度| 国产成人精品综合| 亚洲日韩中文字幕在线播放| 日韩av最新在线观看| www.亚洲一二| 色哟哟亚洲精品一区二区| 亚洲精品一区二区网址| 国产精品91一区| 九九久久久久99精品| 日韩在线观看网址| 亚洲午夜精品久久久久久性色| 亚洲国内高清视频| 日韩av电影免费观看高清| 日韩视频免费在线| 激情久久av一区av二区av三区| 91久久嫩草影院一区二区| 成人黄色片在线| 亚洲精品色婷婷福利天堂| 庆余年2免费日韩剧观看大牛| 一本色道久久88亚洲综合88| 狠狠色噜噜狠狠狠狠97| 国产成人亚洲精品| 国产在线观看91精品一区| 91精品国产777在线观看| 国产精品第三页| 97久久精品人人澡人人爽缅北| 亚洲精品在线视频| 性欧美在线看片a免费观看| 欧美黑人性猛交|