Java多態(tài)

直接上代碼看:

Pragma mark — NO.1 理解多態(tài)--基礎(chǔ)代碼:
public class Animal {
    public static void main(String[] args){
        //以前的方法創(chuàng)建貓對象
        //這句理解為 創(chuàng)建一個貓對象织阅,貓就是一只貓拯田,不是其它的什么東西
        Cat c = new Cat();
        c.eat();
        //多態(tài)的創(chuàng)建方法
        // Animal1 a 是聲明了一個父類引用勒奇,這個引用指向了子類對象直秆。就是說貓是一個動物濒募。 這就是那句要有父類引用指向子類對象
        //
        Animal1 a = new Cat();
        a.eat();//這個的輸出結(jié)果還是貓要吃魚
    }
}
/*
* 多態(tài)概述:事物存在的多種形態(tài)
* 多態(tài)前提:
* 1.要有繼承關(guān)系
* 2.要有方法重寫
* 3.要有父類引用指向子類對象
*
* */

//定義一個動物類
class  Animal1{
    //定義一個吃方法
    public  void  eat(){
        System.out.println("動物吃法");
    }
}
//定義一個貓類繼承自Animal
class  Cat extends  Animal1{
    //重寫父類的吃的方法
    public  void eat(){
         System.out.println("貓要吃魚");
    }
}


Pragma mark — NO.2 多態(tài)成員變量
public class Polymorphic {

    public static void main(String[] args){
     Father f = new Son();//父類引用指向子類對象
        System.out.println(f.num);
        //這個打印結(jié)果是10; 編譯看左邊/運行看右邊
        //解釋一下:
        /*
        * 當我們創(chuàng)建new Son() 子類對象的時候,子類對象可以訪問分類的成員變量圾结。
        * 是通過super來訪問的瑰剃,對于子類創(chuàng)建好在堆區(qū)分配好內(nèi)存后,就會有兩塊區(qū)域筝野,一塊是
        * 父類的成員變量顯示初始化為10晌姚,通過super訪問的
        * 另一塊就是子類自己的成員變量初始化為20
        * 對于f.num ,來說這個指針引用是指向father的,所以它只能看到子類中屬于自己的
        * 那塊區(qū)域歇竟,所以打印為10
        **/

        //再來
        Son s = new Son();
        System.out.println(s.num);
    }
}

//父類
class  Father{
    //成員變量
    int num = 10;
}
//子類
class  Son extends  Father{
    int num = 20;
}

Pragma mark — NO.3 成員方法
 //成員方法:編譯看左邊/運行看右邊
        Father f = new Son();
        f.print();//打印出來是:我是子類挥唠。這個就是動態(tài)綁定
        //編譯的時候,先去找父類有沒有這個print方法焕议,如果有宝磨,編譯通過,然后運行的時候去子類中找這個print方法

//父類
class  Father{
    //成員變量
    int num = 10;
    //成員方法
    public void print(){
        System.out.println("我是父類");
    }

}
//子類
class  Son extends  Father{
    int num = 20;
    public void print(){
        System.out.println("我是子類");
    }




Pragma mark — NO.4 靜態(tài)方法

        //靜態(tài)方法--編譯看左邊,運行看左邊
        Father f = new Son();
        f.method();//打印我是父類靜態(tài)方法

class  Father{
    //成員變量
    int num = 10;
    //成員方法
    public void print(){
        System.out.println("我是父類");
    }
    //靜態(tài)方法
    public  static  void method(){
       System.out.println("我是父類靜態(tài)方法");
    }
}
//子類
class  Son extends  Father{
    int num = 20;
    public void print(){
        System.out.println("我是子類");
    }
    //靜態(tài)方法
    public  static  void method(){
        System.out.println("我是子類靜態(tài)方法");
    }
}



Pragma mark — NO.5 超人的例,理解向上和向下轉(zhuǎn)型
public class SuperMan {
    public static void main(String[] args){

    Person1 p = new Super();//父類引用指向子類對象唤锉,可以理解為超人平時偽裝為一個普通人
        //父類引用指向子類對象就是向上轉(zhuǎn)型:就相當于將super這個子類提升到了父類的層次

       //就是說初次見面世囊,超人只會說他是json,來談生意的窿祥,不會是他是超人株憾,但是實際和你談生意的是超人
        System.out.println(p.name);
        p.takeMethod();

     //然后出現(xiàn)情況,超人要去救人晒衩,但是沒證明他是超人之前是不會讓他去救人的
        //p.fly();//這樣調(diào)用超人的方法是會出錯的嗤瞎,因為當前超人是以普通人身份出現(xiàn)的,他就不具備救人的技能

        //所以我們想要去救人听系,就得向人們證明你是超人猫胁,所以我們得做一個向下轉(zhuǎn)型
        Super s = (Super)p; //這個就是向下轉(zhuǎn)型
        System.out.println(s.name);
        s.fly();

        /*
        * 基本數(shù)據(jù)類型自動類型提升和強制類型轉(zhuǎn)換
        * */
        int i = 10;
        byte b = 20 ;
        i = b;//這就是自動類型提升
        System.out.println(String.valueOf(i));

        //b = i;//直接將int型賦值給byte類型會報錯,是把大類型賦值給小類型跛锌,會有精度損失
        b = (byte)i;//強制類型轉(zhuǎn)換
    }
}
//我們通過這個例子描述一個超人的故事
 class  Person1 {
    //平時的時候超人叫json,在談生意
    String name = "我叫Json";
    public  void takeMethod(){
        System.out.println("我來和你談生意");
    }

}
//子類--超人
class  Super extends Person1 {
    String name = "我是SuperMan";
    public  void takeMethod(){
        System.out.println("我是超人來和你談生意");
    }
    //超人特有的方法
    public  void fly(){
        System.out.println("我要去救人了哦");
    }
}
Pragma mark — NO.6 多態(tài)的好處
public class Main {

    public static void main(String[] args) {

         //創(chuàng)建貓對象
//        Cat c1 = new Cat();
//        c1.eat();
   //我們想讓貓吃的動作執(zhí)行很多次,我們寫個方法

        method(new Cat());
        //method(new Dog());這樣寫是錯誤的弃秆,狗是一只貓是不行的塞
        method(new Dog());
    }

//    public  static  void method(Cat c){
//        c.eat();
//    }
//
//    public  static  void method1(Dog d){
//
//        d.eat();
//    }
   //看了上面的,思考如果我們還有單獨的豬髓帽,牛菠赚,羊類,意味著這種method方法我們都要去寫一遍了郑藏。這肯定不好
    //想想解決辦法

    //我們直接傳入這個父類衡查,當我們傳入?yún)?shù)是子類的時候,就相當于父類引用指向子類對象了
   public  static void method(Animal a ){
//       a.eat();
//       //這樣寫有好的地方必盖,弊端我們看看
//      // a.catchMouse();//這個方法是狗類自己的拌牲,編譯時在父類中找不到,所以不行
//       //要使用子類獨有的方法歌粥,我們可以進行向下轉(zhuǎn)型
//       Dog d = (Dog)a;
//       d.lookHome();
       //介紹一個關(guān)鍵字 instanceof:判斷前面的引用是否是后面的類型
       if (a instanceof Cat){

           Cat c = (Cat)a;
           c.eat();
           c.catchMouse();

       }else {
           Dog d = (Dog)a;
           d.eat();
           d.lookHome();
           //開發(fā)中很少這樣去調(diào)用子類的特有方法塌忽,比較麻煩

       }

   }
}

/*
* 多態(tài)的好處:
* a:提高了代碼的維護性(繼承保證)
* b:提高了代碼的擴展性(多態(tài)保證)
* B:案例演示:
* 多態(tài)的好處
* 可以當做形式參數(shù),可以接收任意子類對象
*
* C:多態(tài)的弊端:
* 不能使用子類的特有屬性和行為
**/

class Animal {

    public  void eat() {

        System.out.println("動物要吃東西");
    }

}

class  Cat extends  Animal {

    public  void eat(){
        System.out.println("貓要吃魚");
    }
    public  void catchMouse(){
        System.out.println("貓要抓老鼠");
    }

}

class  Dog extends  Animal{

    public  void eat() {
        System.out.println("狗吃肉");
    }

    public  void lookHome(){

        System.out.println("狗狗會看家");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末失驶,一起剝皮案震驚了整個濱河市土居,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嬉探,老刑警劉巖擦耀,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涩堤,居然都是意外死亡眷蜓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門胎围,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吁系,“玉大人芹敌,你說我怎么就攤上這事】蹇梗” “怎么了氏捞?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冒版。 經(jīng)常有香客問我液茎,道長,這世上最難降的妖魔是什么辞嗡? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任捆等,我火速辦了婚禮,結(jié)果婚禮上续室,老公的妹妹穿的比我還像新娘栋烤。我一直安慰自己,他們只是感情好挺狰,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布坑律。 她就那樣靜靜地躺著壳澳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抵栈,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天胜茧,我揣著相機與錄音褪尝,去河邊找鬼玖绿。 笑死,一個胖子當著我的面吹牛学赛,可吹牛的內(nèi)容都是我干的年堆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼盏浇,長吁一口氣:“原來是場噩夢啊……” “哼变丧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缠捌,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锄贷,失蹤者是張志新(化名)和其女友劉穎译蒂,沒想到半個月后曼月,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡柔昼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年哑芹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捕透。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡聪姿,死狀恐怖碴萧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情末购,我是刑警寧澤破喻,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站盟榴,受9級特大地震影響曹质,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擎场,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一羽德、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迅办,春花似錦宅静、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矾策,卻和暖如春匀伏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝴韭。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工够颠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榄鉴。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓履磨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庆尘。 傳聞我的和親對象是個殘疾皇子剃诅,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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

  • 一、多態(tài) 1. 概述 理解:多態(tài)可以理解為事物存在的多種體(表)現(xiàn)形態(tài)几苍。例如:動物中的貓和狗翻屈。貓這個對象對應(yīng)的是貓...
    陳凱冰閱讀 337評論 0 1
  • 多態(tài),英語Polymorphism妻坝,由希臘語的兩個單詞polys(意為many, much)和morphē(意為f...
    法蘭克胡閱讀 561評論 0 2
  • 1.封裝 封裝的定義: 首先是抽象伸眶,把事物抽象成一個類惊窖,其次才是封裝,將事物擁有的屬性和動作隱藏起來厘贼,只保留特定的...
    時待吾閱讀 404評論 0 1
  • 寫在前面 由于找工作的原因界酒,最近幾個月都沒有更新博客了。嘴秸。盾计。這篇可能是今年最后一篇總結(jié)類的博文了,希望能夠?qū)懙暮命c...
    niaoge2016閱讀 9,127評論 1 52
  • 多態(tài)通過分離做什么和怎么做赁遗,從另一個角度將接口實現(xiàn)分離開來 多態(tài)的作用是消除類型之間的耦合 多態(tài)方法允許一種類型表...
    CrazyYong閱讀 707評論 1 4