大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學(xué)習(xí)攻略 Java培訓(xùn) 動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)詳解java三大特性之多態(tài)

動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)詳解java三大特性之多態(tài)

更新時(shí)間:2019-09-17 11:19:31 來源:動力節(jié)點(diǎn) 瀏覽2699次

 

今天動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家介紹java三大特性之多態(tài),希望通過此大家能夠掌握java三大特性之多態(tài),下面就隨小編一起來了解一下java三大特性之多態(tài)。


u=413209375,3586319870&fm=11&gp=0.jpg


  1、java多態(tài)的定義:是指允許不同類的對象對同一消息做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式。(發(fā)送消息就是函數(shù)調(diào)用)


  2、實(shí)現(xiàn)java多態(tài)的技術(shù)稱為:動態(tài)綁定(dynamicbinding),是指在執(zhí)行期間判斷所引用對象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。


  3、java多態(tài)的作用:消除類型之間的耦合關(guān)系。


  4、現(xiàn)實(shí)中,關(guān)于多態(tài)的例子不勝枚舉。比方說按下F1鍵這個(gè)動作,如果當(dāng)前在Flash界面下彈出的就是AS3的幫助文檔;如果當(dāng)前在Word下彈出的就是Word幫助;在Windows下彈出的就是Windows幫助和支持。同一個(gè)事件發(fā)生在不同的對象上會產(chǎn)生不同的結(jié)果。


  5、java多態(tài)存在的三個(gè)必要條件:


(1)要有繼承;


(2)要有重寫;


(3)父類引用指向子類對象。


  6、java多態(tài)的好處:


  (1)可替換性(substitutability):多態(tài)對已存在代碼具有可替換性。例如,多態(tài)對圓Circle類工作,對其他任何圓形幾何體,如圓環(huán),也同樣工作。


  (2)可擴(kuò)充性(extensibility):多態(tài)對代碼具有可擴(kuò)充性。增加新的子類不影響已存在類的多態(tài)性、繼承性,以及其他特性的運(yùn)行和操作。實(shí)際上新加子類更容易獲得多態(tài)功能。例如,在實(shí)現(xiàn)了圓錐、半圓錐以及半球體的多態(tài)基礎(chǔ)上,很容易增添球體類的多態(tài)性。


  (3)接口性(interface-ability):多態(tài)是超類通過方法簽名,向子類提供了一個(gè)共同接口,由子類來完善或者覆蓋它而實(shí)現(xiàn)的。


  (4)靈活性(flexibility):它在應(yīng)用中體現(xiàn)了靈活多樣的操作,提高了使用效率。


  (5)簡化性(simplicity):多態(tài)簡化對應(yīng)用軟件的代碼編寫和修改過程,尤其在處理大量對象的運(yùn)算和操作時(shí),這個(gè)特點(diǎn)尤為突出和重要。


  貓狗案例代碼


class Animal {

    public void eat(){

        System.out.println("eat");

    }

    public void sleep(){

        System.out.println("sleep");

    }

}

class Dog extends Animal {

    public void eat(){

        System.out.println("狗吃肉");

    }

    public void sleep(){

        System.out.println("狗站著睡覺");

    }

}

class Cat extends Animal {

    public void eat() {

        System.out.println("貓吃魚");

    }

    public void sleep() {

        System.out.println("貓趴著睡覺");

    }

}

class Pig extends Animal {

    public void eat() {

        System.out.println("豬吃白菜");

    }

    public void sleep() {

        System.out.println("豬側(cè)著睡");

    }

}

//針對動物操作的工具類

class AnimalTool {

    private AnimalTool(){

    }

    /*

  //調(diào)用貓的功能

  public static void useCat(Cat c) {

    c.eat();

    c.sleep();

  }

  //調(diào)用狗的功能

  public static void useDog(Dog d) {

    d.eat();

    d.sleep();

  }

  //調(diào)用豬的功能

  public static void usePig(Pig p) {

    p.eat();

    p.sleep();

  }

  */

    public static void useAnimal(Animal a) {

        a.eat();

        a.sleep();

    }

    //把所有的可能都?xì)w為動物類

}

class DuoTaiDemo2 {

    public static void main(String[] args) {

        //我喜歡貓,就養(yǎng)了一只

        Cat c = new Cat();

        c.eat();

        c.sleep();

        //我很喜歡貓,所以,又養(yǎng)了一只

        Cat c2 = new Cat();

        c2.eat();

        c2.sleep();

        //我特別喜歡貓,又養(yǎng)了一只

        Cat c3 = new Cat();

        c3.eat();

        c3.sleep();

        //...

        System.out.println("--------------");

        //問題來了,我養(yǎng)了很多只貓,每次創(chuàng)建對象是可以接受的

        //但是呢?調(diào)用方法,你不覺得很相似嗎?僅僅是對象名不一樣。

        //我們準(zhǔn)備用方法改進(jìn)

        //調(diào)用方式改進(jìn)版本

        //useCat(c);

        //useCat(c2);

        //useCat(c3);

        //AnimalTool.useCat(c);

        //AnimalTool.useCat(c2);

        //AnimalTool.useCat(c3);

        AnimalTool.useAnimal(c);

        AnimalTool.useAnimal(c2);

        AnimalTool.useAnimal(c3);

        System.out.println("--------------");

        //我喜歡狗

        Dog d = new Dog();

        Dog d2 = new Dog();

        Dog d3 = new Dog();

        //AnimalTool.useDog(d);

        //AnimalTool.useDog(d2);

        //AnimalTool.useDog(d3);

        AnimalTool.useAnimal(d);

        AnimalTool.useAnimal(d2);

        AnimalTool.useAnimal(d3);

        System.out.println("--------------");

        //我喜歡寵物豬

        //定義一個(gè)豬類,它要繼承自動物,提供兩個(gè)方法,并且還得在工具類中添加該類方法調(diào)用

        Pig p = new Pig();

        Pig p2 = new Pig();

        Pig p3 = new Pig();

        //AnimalTool.usePig(p);

        //AnimalTool.usePig(p2);

        //AnimalTool.usePig(p3);

        AnimalTool.useAnimal(p);

        AnimalTool.useAnimal(p2);

        AnimalTool.useAnimal(p3);

        System.out.println("--------------");

        //我喜歡寵物狼,老虎,豹子...

        //定義對應(yīng)的類,繼承自動物,提供對應(yīng)的方法重寫,并在工具類添加方法調(diào)用

        //前面幾個(gè)必須寫,我是沒有意見的

        //但是,工具類每次都改,麻煩不

        //我就想,你能不能不改了

        //太簡單:把所有的動物都寫上。問題是名字是什么呢?到底哪些需要被加入呢?

        //改用另一種解決方案。

    }

    /*

  //調(diào)用貓的功能

  public static void useCat(Cat c) {

    c.eat();

    c.sleep();

  }

  //調(diào)用狗的功能

  public static void useDog(Dog d) {

    d.eat();

    d.sleep();

  }

  */

}


  7、Java中多態(tài)的實(shí)現(xiàn)方式:接口實(shí)現(xiàn),繼承父類進(jìn)行方法重寫,同一個(gè)類中進(jìn)行方法重載。


  8、Java中多態(tài)的分類:


  (1)person為父類,student為子類。那么:personp=newstudent();


  (2)fliable為接口,bird為實(shí)現(xiàn)接口的類,那么:fliablef=newbird();


  (3)fliable為抽象類,bird為繼承fliable的類,那么:fliablef=newbird();


  多態(tài)時(shí)需要說明p聲明為父類的引用,但他實(shí)際為子類引用。但是他只能調(diào)用父類中的方法。如果子類中的方法覆蓋了父類方法,那么將調(diào)用父類方法(虛方法調(diào)用)。接口多態(tài)也是同樣的,也許你會問,如果f要調(diào)用自己的方法,那豈不是出錯(cuò)了?其實(shí)這里也是方法的覆蓋,因?yàn)閷?shí)現(xiàn)接口的子類肯定會實(shí)現(xiàn)接口中的方法,所以此種情況下調(diào)用的是bird中的方法。但是如果bird有一個(gè)方法在接口中沒有定義,那么f不能調(diào)用。


  9、instanceof運(yùn)算符:


  java語言的多態(tài)機(jī)制導(dǎo)致了引用變量的聲明類型和其實(shí)際引用對象的類型可能不一致,再結(jié)合虛方法調(diào)用規(guī)則可以得出結(jié)論:聲明為同種類型的兩個(gè)引用變量調(diào)用同一個(gè)方法時(shí)也可能會有不同的行為。這里就引入了instanceof運(yùn)算符。


  那么如果小編聲明了personp=newstudent();小編想將p轉(zhuǎn)為student的可不可以?當(dāng)然可以,但是就得強(qiáng)制轉(zhuǎn)換了(兒子想成為父親直接來,父親想成為兒子你就強(qiáng)來)。


  通常在強(qiáng)制轉(zhuǎn)換時(shí)加上instanceof來判斷。


  if(pinstanceofstudent){students=(student)p;}


  多態(tài)貫穿于java整個(gè)學(xué)習(xí),比如在異常處理時(shí)寫catch語句,我們規(guī)定必須子類異常寫在前,父類異常寫在后。為什么呢?原因就是多態(tài)了。我們的catch語句格式:catch(Exceptione)。java程序在產(chǎn)生異常時(shí)會自動生成一個(gè)異常對象,如果先產(chǎn)生一個(gè)子類異常,并且父類異常寫在前,那么根據(jù)多態(tài)肯定會執(zhí)行此catch語句,執(zhí)行完一條catch語句后將會跳出。


  10、實(shí)例:


class A

{

    public String show(D obj)...{

        return ("A and D");

    }

    public String show(A obj)...{

        return ("A and A");

    }

}

class B extends A

{

    public String show(B obj)...{

        return ("B and B");

    }

    public String show(A obj)...{

        return ("B and A");

    }

}

class C extends B{

}

class D extends B{

}

class E

{

    public static void main(String [] args)

       {

        A a1 = new A();

        A a2 = new B();

        B b = new B();

        C c = new C();

        D d = new D();

        System.out.println(a1.show(b));

        //①

        System.out.println(a1.show(c));

        //②

        System.out.println(a1.show(d));

        //③

        System.out.println(a2.show(b));

        //④

        System.out.println(a2.show(c));

        //⑤

        System.out.println(a2.show(d));

        // ⑥

        System.out.println(b.show(b));

        //⑦

        System.out.println(b.show(c));

        //⑧

        System.out.println(b.show(d));

        //⑨

    }

}


答案


①  A and A

②  A and A

③  A and D

④  B and A

⑤  B and A

⑥  A and D

⑦  B and B

⑧  B and B

⑨  A and D


該問題的關(guān)鍵有兩點(diǎn):


  一是子類與父類的關(guān)系,二是重載方法的調(diào)用問題。


  子類對象可以直接當(dāng)成父類對象使用,但反過來就不可以。舉例來說,人是父類,學(xué)生是人的子類,所以學(xué)生對象一定具備人對象的屬性,但是人對象就未必具有學(xué)生對象的特性。所以學(xué)生對象可以當(dāng)做人對象來使用,但是人對象就不能當(dāng)做學(xué)生對象使用。注意當(dāng)把子類對象當(dāng)成父類對象使用時(shí),子類對象將失去所有的子類特性,只保留與父類同名的屬性和方法(同名方法不僅是函數(shù)名相同,而且參數(shù)類型也要一樣,否則不予保留)。


  一個(gè)類中如果定義了重載的方法,則系統(tǒng)在調(diào)用方法時(shí),會根據(jù)參數(shù)的類型自動選擇調(diào)用合適的方法。


  (1)a1.shows(b),在A中沒有含有B類參數(shù)的方法,但是含有A類參數(shù)的方法,根據(jù)子類對象父類可用的原則,所以調(diào)用方法


  publicStringshow(Aobj)...{return("AandA");}


(2)a1.show(c),C類是B類的子類,而B類又是A類的子類,所以C類對象可以當(dāng)制作A類對象使用。結(jié)果同上。


  (3)a1.show(d),根據(jù)參數(shù)類型直接調(diào)用A中的方法

 

publicStringshow(Dobj)...{


return("AandD");}


(4)a2.show(b),a2本來是一個(gè)B對象,但是將其賦給了A類變量,所以a2只保留了與父類A同名的屬性和方法。a2.show(b)調(diào)用B類中的保留的與父類同名同參方法


public String show(A obj)...{

return ("B and A");

}


  (5) a2.show(c),B類的保留方法中沒有C類參數(shù)方法,但是有含有C的父類B的參數(shù)方法,所以調(diào)用的方法


public String show(A obj)...{

return ("B and A");

}

  

(6) a2.show(d),調(diào)用的是A類中的


public String show(D obj)...{

return ("A and D");

}


  (7) b.show(b),調(diào)用B類中的


public String show(B obj)...{

return ("B and B");

}


  (8)0b.show(c),B類中沒有C類參數(shù)的方法,但是有B類參數(shù)的方法,所以調(diào)用方法


public String show(B obj)...{

return ("B and B");

}


  (9) b.show(d),解釋同8


以上就是動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)小編為大家介紹的“java三大特性之多態(tài)”的內(nèi)容,希望對大家有幫助,更多java最新資訊請繼續(xù)關(guān)注動力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。


相關(guān)免費(fèi)視頻教程推薦


java多態(tài)視頻教程下載:http://m.dabaquan.cn/xiazai/2604.html


提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 2022久久国产精品免费热麻豆 | 国产精品免费久久久免费 | 日韩短视频| 国产成人h综合亚洲欧美在线 | 国产亚洲精品久久精品6 | 毛片基地免费视频a | 色老头老太xxxxbbbb | 久久精品久久精品久久 | 国产极品福利视频在线观看 | 日本精品久久久久中文字幕 | 日韩毛片一级 | 亚洲日本va中文字幕婷婷 | 日本一区色| 超91视频| 欧美国产亚洲一区二区三区 | 国产成人在线视频免费观看 | 99精品欧美一区二区三区 | 日韩精品特黄毛片免费看 | 国产91成人精品亚洲精品 | 一区二区三区欧美日韩国产 | 2021国产在线视频 | 性欧美极品xxxx欧美一区二区 | 亚州中文字幕 | 四虎影视永久在线精品免费 | 精品成人免费视频 | 中文字幕一区二区视频 | 亚洲精品久久久久久小说 | 在线视频一区二区三区四区 | 久久久香蕉视频 | 欧美日韩亚洲国内综合网香蕉 | 国产一区二区三区精品久久呦 | 欧美精品一区二区三区观 | 大香线一本 | 精品一区二区三区在线观看l | 国产精品久久久久久久伊一 | 亚洲精品综合一二三区在线 | 国产一区二区三区免费在线观看 | 免看一级a毛片一片成人不卡 | 视频三区精品中文字幕 | 国产一区二区在线播放 | 国产欧美精品一区二区三区 |