(三)多態(tài)

多態(tài)理解

當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯(cuò)誤;如果有,再去調(diào)用子類的同名方法

多態(tài)必要條件

  1. 繼承
  2. 重寫
  3. 父類引用指向子類對(duì)象

多態(tài)簡(jiǎn)單例子

package basicForMando俄精;
/*
 * @name 多態(tài)
 * @description 公共父類
 * @question 
 *  1.Cat 是什么 和  Animal2 有關(guān)嗎
 *  2. instanceof 如何判斷類型
 *  3. (Cat)a 是什么意思 為什么帶括號(hào)
 * */
public class Polymorphic {

    public static void main(String[] args) {
        show(new Cat());//3 Cat對(duì)象調(diào)用show方法
    }
    //  3.1 傳參new Cat() 到 a => Animal2 a = new Cat();
    public static void show(Animal2 a){
        //4.1 輸出 new Cat().eat()
        a.eat();
        // 判斷類型     
        if(a instanceof Cat){
            System.out.println(a);
            // instanceof Cat ?         
            System.out.println(a instanceof Cat);
            //(Cat)a
            Cat cat =(Cat)a;
            //4.2 輸出 Cat().work()
            cat.work();
        }
    }

}
//1.建立父類(超類)
abstract class Animal2{
//  方法還是變量?
    abstract void eat();
}
//2.繼承父類
class Cat extends Animal2{
    //2.1 重寫父類方法(父類中沒有就會(huì)報(bào)錯(cuò))
    public void eat(){
        System.out.println("吃魚");
    }
    //2.2 子類獨(dú)有方法    
    public void work(){
        System.out.println("抓老鼠");
    }
    
}

多態(tài)復(fù)雜例子

Employee(父類超類)

package finance;
/*
 * 父類(超類)
 * 構(gòu)造函數(shù)里 this.name 是成員變量private String name,name 為參數(shù)String name;
 * */
public class Employee {
    private String name;
      private String address;
      private int number;
  
      // 父類(超類)構(gòu)造函數(shù)
      public Employee(String name, String address, int number) {
          System.out.println("Employee 構(gòu)造函數(shù)");
          //構(gòu)造函數(shù)里 this.name 是成員變量private String name,name 為參數(shù)String name;
          this.name = name;
          this.address = address;
          this.number = number;
          
      }
  
      public void mailCheck() {
          System.out.println("郵寄支票給:" + this.name + " " + this.address);
      }
  
      public String toString() {
          return name + " " + address + " " + number;
      }
  
      public String getName() {
          return name;
      }
  
      public String getAddress() {
          return address;
      }
  
      public void setAddress(String newAddress) {
          address = newAddress;
      }
  
      public int getNumber() {
          return number;
      }
}


Salary(子類繼承父類)

package finance;

public class Salary extends Employee {
    private double salary;//全年工資
      //    繼承父類,子類構(gòu)造函數(shù)
      public Salary(String name,String address,int number,double salary){
          // 傳參繼承的父類Employee
          super(name,address,number);
          setSalary(salary);
          
      }
      public void mailCheck(){
          System.out.println("Salary 類的 mailCheck 方法");
          System.out.println("郵寄支票給:" + getName() +",工資為:" +salary);
      }
      public double getSalary(){
          return salary;        
      }
      public void setSalary(double newSalary){
          if(newSalary >= 0.0){
              salary = newSalary ;
          }
      }
      public double computePay(){
          System.out.println("計(jì)算公司,付給:" + getName());
          return salary/52;
      }
}


輸出

package finance;

public class VirtualDemo {
    public static void main(String[] args) {
          // TODO Auto-generated method stub
          Salary s = new Salary("員工 A", "北京", 3 , 3600.00);
          Employee e = new Salary("員工 B", "上海", 2, 2400.00);
          System.out.println("使用 Salary 的引用調(diào)用 mailCheck -- ");
          s.mailCheck();
          System.out.println("\n使用 Employee 的引用調(diào)用 mailCheck--");
          e.mailCheck();
      }
}


--print--
Employee 構(gòu)造函數(shù)
Employee 構(gòu)造函數(shù)
使用 Salary 的引用調(diào)用 mailCheck -- 
Salary 類的 mailCheck 方法
郵寄支票給:員工 A,工資為:3600.0

使用 Employee 的引用調(diào)用 mailCheck--
Salary 類的 mailCheck 方法
郵寄支票給:員工 B,工資為:2400.0

例子解析

  1. 實(shí)例中瞒窒,實(shí)例化了兩個(gè) Salary 對(duì)象:一個(gè)使用 Salary 引用 s盼忌,另一個(gè)使用 Employee 引用 e剿干。
  2. 當(dāng)調(diào)用 s.mailCheck() 時(shí),編譯器在編譯時(shí)會(huì)在 Salary 類中找到mailCheck(),執(zhí)行過程 JVM 就調(diào)用 Salary 類的 mailCheck()。
  3. 因?yàn)?e 是 Employee 的引用近范,所以調(diào)用 e 的 mailCheck() 方法時(shí)嘶摊,編譯器會(huì)去 Employee 類查找 mailCheck() 方法 延蟹。
  4. 在編譯的時(shí)候,編譯器使用 Employee 類中的 mailCheck() 方法驗(yàn)證該語句叶堆, 但是在運(yùn)行的時(shí)候阱飘,Java虛擬機(jī)(JVM)調(diào)用的是 Salary 類中的 mailCheck() 方法。

以上整個(gè)過程被稱為虛擬方法調(diào)用虱颗,該方法被稱為虛擬方法沥匈。
Java中所有的方法都能以這種方式表現(xiàn),因此忘渔,重寫的方法能在運(yùn)行時(shí)調(diào)用高帖,不管編譯的時(shí)候源代碼中引用變量是什么數(shù)據(jù)類型。

多態(tài)的實(shí)現(xiàn)方式

多態(tài)的實(shí)現(xiàn)方式

方式一:重寫

這個(gè)內(nèi)容已經(jīng)在上一章節(jié)詳細(xì)講過畦粮,就不再闡述散址,詳細(xì)可訪問:Java 重寫(Override)與重載(Overload)

方式二:接口

    1. 生活中的接口最具代表性的就是插座宣赔,例如一個(gè)三接頭的插頭都能接在三孔插座中预麸,因?yàn)檫@個(gè)是每個(gè)國家都有各自規(guī)定的接口規(guī)則,有可能到國外就不行儒将,那是因?yàn)閲庾约憾x的接口類型吏祸。
    1. java中的接口類似于生活中的接口,就是一些方法特征的集合钩蚊,但沒有方法的實(shí)現(xiàn)贡翘。具體可以看 java接口 這一章節(jié)的內(nèi)容蹈矮。

方式三:抽象類和抽象方法

詳情請(qǐng)看 Java抽象類 章節(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸣驱,一起剝皮案震驚了整個(gè)濱河市含滴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丐巫,老刑警劉巖谈况,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異递胧,居然都是意外死亡碑韵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門缎脾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祝闻,“玉大人,你說我怎么就攤上這事遗菠×” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵辙纬,是天一觀的道長豁遭。 經(jīng)常有香客問我,道長贺拣,這世上最難降的妖魔是什么蓖谢? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮譬涡,結(jié)果婚禮上闪幽,老公的妹妹穿的比我還像新娘。我一直安慰自己涡匀,他們只是感情好盯腌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陨瘩,像睡著了一般腕够。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拾酝,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天燕少,我揣著相機(jī)與錄音,去河邊找鬼蒿囤。 笑死客们,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播底挫,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼恒傻,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了建邓?” 一聲冷哼從身側(cè)響起盈厘,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎官边,沒想到半個(gè)月后沸手,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡注簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年契吉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡渴。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捐晶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妄辩,到底是詐尸還是另有隱情惑灵,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布眼耀,位于F島的核電站英支,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏畔塔。R本人自食惡果不足惜潭辈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一鸯屿、第九天 我趴在偏房一處隱蔽的房頂上張望澈吨。 院中可真熱鬧,春花似錦寄摆、人聲如沸谅辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽桑阶。三九已至,卻和暖如春勾邦,著一層夾襖步出監(jiān)牢的瞬間蚣录,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工眷篇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萎河,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像虐杯,于是被迫代替她去往敵國和親玛歌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 父類與子類 在Java術(shù)語中擎椰,如果C1類擴(kuò)展自另一個(gè)類C2支子,我們稱C2為父類,也稱超類或基類达舒,稱C1為子類值朋,也稱次...
    Steven1997閱讀 1,151評(píng)論 1 2
  • 多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。 多態(tài)就是同一個(gè)接口巩搏,使用不同的實(shí)例而執(zhí)行不同操作吞歼,如圖所示: ...
    Java架構(gòu)學(xué)習(xí)者閱讀 274評(píng)論 0 1
  • 多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。 多態(tài)就是同一個(gè)接口塔猾,使用不同的實(shí)例而執(zhí)行不同操作篙骡,如圖所示: ...
    java伯爵閱讀 1,993評(píng)論 0 0
  • 多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。 多態(tài)就是同一個(gè)接口丈甸,使用不同的實(shí)例而執(zhí)行不同操作糯俗,如圖所示: ...
    Java機(jī)械師閱讀 2,274評(píng)論 1 0
  • 52065cb81649閱讀 96評(píng)論 0 0