欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java全面分析面向?qū)ο笾鄳B(tài)

 更新時(shí)間:2022年04月25日 15:43:35   作者:厚積薄發(fā)?  
多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量到底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定

多態(tài)的理解

什么是多態(tài)呢??從字面理解就是多種形態(tài),也就是不同類實(shí)例化出來的對(duì)象調(diào)用同一種方法,也可以理解為不同類的對(duì)象經(jīng)過同一種行為產(chǎn)生的狀態(tài)是不同的,這就是多態(tài)。

要想理解多態(tài),我們必須要了解向上轉(zhuǎn)型和重寫這兩個(gè)重點(diǎn)然后在來深刻理解多態(tài)這一概念,等看完向上轉(zhuǎn)型與重寫再來看多態(tài)的概念,你就會(huì)豁然開朗,一下就通透了不少。因?yàn)槎鄳B(tài)的條件就是向上轉(zhuǎn)型,重寫以及繼承。

向上轉(zhuǎn)型

首先多態(tài)的前提是繼承,那既然是繼承,那就肯定就有父類與子類這樣的關(guān)系。

我們?cè)賮砘貞浺幌略趺磩?chuàng)建子類對(duì)象和父類對(duì)象。

class Animal{
    public String name;//名字
    public int age;
    public void eat() {
        System.out.println("我要吃飯?。?!");
    }
    public void sleep() {
        System.out.println("我要睡覺?。?!");
    }
}
class Cat extends Animal{
    public void mew() {
        System.out.println("喵喵喵!?。?);
    }
}
public class TestDemo1 {
    public static void main(String[] args) {
         Cat cat =new Cat();//實(shí)例化子類對(duì)象
         cat.name="mimi";
         Animal animal = new Animal();//實(shí)例化父類對(duì)象
         animal.eat();
    }
}

這里就創(chuàng)建了貓這個(gè)類然后繼承了Animal類。我們實(shí)例化貓和Animal這個(gè)對(duì)象就可以調(diào)用方法和屬性。

那何為向上轉(zhuǎn)型呢???

原本子類對(duì)象的引用引用子類的對(duì)象,現(xiàn)在讓父類的引用引用子類對(duì)象這就是向上轉(zhuǎn)型。

我們利用代碼理解一下:

 這就是向上轉(zhuǎn)型,我們也可以利用animal這個(gè)父類引用 調(diào)用方法;

 這時(shí)我們就會(huì)發(fā)現(xiàn)利用這個(gè)引用能夠調(diào)用父類的方法和屬性,但是不能夠調(diào)用子類的方法和屬性,那為什么呢??原因就是因?yàn)楦割悰]有子類這個(gè)方法,所以不能調(diào)用。總結(jié):向上轉(zhuǎn)型的時(shí)候也就是父類引用引用子類對(duì)象,這個(gè)父類引用只能調(diào)用父類有的屬性和方法,不能調(diào)用子類的。

向上轉(zhuǎn)型的三種形式

第一種:直接賦值

也就是我們上面的那種寫法:

  Animal animal1 = new Cat();//父類對(duì)象的引用 引用子類對(duì)象--->向上轉(zhuǎn)型
  Animal animal2 = new Dog();

第二種:作為方法參數(shù):

  第三種作為返回值:

我們回到剛才的打印結(jié)果是什么;

但如果我把父類的方法變成我要吃貓糧呢?那結(jié)果毫無意外就是mimi我要吃貓糧。

但是這就會(huì)出現(xiàn)一個(gè)問題,如果我在創(chuàng)建一個(gè)狗類,然后在調(diào)用eat方法  難道狗也要吃貓糧么?這就會(huì)出現(xiàn)問題,那我們可以在子類寫一個(gè)eat方法;

class Animal{
    public String name;//名字
    public int age;
    public void eat() {
        System.out.println(this.name+"要吃飯?。。?);
    }
}
class Dog extends Animal{
    public void dark() {
        System.out.println("汪汪汪?。?!");
    }
    public void eat() {
        System.out.println(this.name+"吃狗糧?。?!");
    }
}
class Cat extends Animal{
    public void mew() {
        System.out.println("喵喵喵?。。?);
    }
    public void eat() {
        System.out.println(this.name+"吃貓糧?。。?);
    }
}
public class TestDemo1 {
    public static void main(String[] args) {
        //語法形式 : 父類 變量 = new 子類();
        Animal animal1 = new Cat();//父類對(duì)象的引用 引用子類對(duì)象--->向上轉(zhuǎn)型
        Animal animal2 = new Dog();//父類對(duì)象的引用 引用子類對(duì)象--->向上轉(zhuǎn)型
        animal1.name = "小貓";//訪問父類屬性
        animal2.name = "小狗";//訪問父類屬性
        animal1.eat();
        animal2.eat();
        // animal.mew();//訪問子類特有的方法
    }
}

 這時(shí)又創(chuàng)建了一個(gè)狗類,然后又分別在兩個(gè)子類創(chuàng)建兩個(gè)eat方法。

 我們發(fā)現(xiàn)這時(shí)候就變得很清楚就達(dá)到我們想要的效果了。

但我們又應(yīng)該想一想,為什么調(diào)用子類的eat方法而不調(diào)用父類的?

動(dòng)態(tài)綁定和靜態(tài)綁定

此時(shí)其實(shí)發(fā)生了動(dòng)態(tài)綁定,我們可以看一下字節(jié)碼文件,打開powershell窗口

我們都知道執(zhí)行一個(gè)程序是先編譯后運(yùn)行,而這個(gè)是在編譯的時(shí)候調(diào)用的是Animal的eat方法,而在運(yùn)行的時(shí)候是調(diào)用的是Cat的方法這就是我們所說的運(yùn)行時(shí)綁定或者可以說是動(dòng)態(tài)綁定。

那既然有動(dòng)態(tài)綁定那肯定也有靜態(tài)綁定。

動(dòng)態(tài)綁定是在編譯的時(shí)候調(diào)用一個(gè)方法,而在運(yùn)行時(shí)才是最后要確定調(diào)用的方法,也就是在運(yùn)行時(shí)確定要調(diào)用那個(gè)方法。

靜態(tài)綁定就是在編譯期間已經(jīng)確定要調(diào)用哪個(gè)方法。

其中,動(dòng)態(tài)綁定最顯著的代表就是方法重寫。

靜態(tài)綁定最顯著的代表就是方法重載。

我們?cè)诨剡^頭看上面的方法 ε=(´ο`*)))......怎么前面的eat方法返回值,參數(shù)列表,方法名都是一樣的呢?我們來看一下。

方法的重寫

我們之前學(xué)過方法重載這里回顧一下方法重載,方法重載是方法名相同,返回值不做要求,參數(shù)列表不同。而我們今天學(xué)的方法重寫是返回值相同,方法名稱相同,參數(shù)列表相同,說是叫方法重寫其實(shí)也可以叫做方法覆蓋。

方法重寫有幾點(diǎn)注意要求:

方法重寫滿足 方法名相同,方法的參數(shù)列表相同,方法的返回值相同。

 我們也可以一鍵生成重寫 

 有幾個(gè)注意事項(xiàng):

 不能重寫被private修飾的方法。

 不能重寫被final修飾的方法。

 子類的方法的訪問權(quán)限一定要大于等于父類的訪問權(quán)限。

重寫的方法, 可以使用 @Override 注解來顯式指定. 有了這個(gè)注解能幫我們進(jìn)行一些合法性校驗(yàn). 例如不小心將方法名字拼寫錯(cuò)了 (比如寫成eat), 那么此時(shí)編譯器就會(huì)發(fā)現(xiàn)父類中沒有 aet 方法, 就會(huì)編譯報(bào)錯(cuò), 提示無法構(gòu)成重寫.

被static修飾的方法也不能被重寫 

總結(jié)方法重寫的注意事項(xiàng):

  • 被private,final修飾的方法不能被重寫。
  • 被staitc修飾的方法也不能被重寫。
  • @override 可以檢查你重寫的方法名是否正確,最好要加上。
  • 方法重寫一定滿足方法名相同,參數(shù)列表相同,返回值相同。

對(duì)比方法重寫與方法重載:

最后:重寫不是進(jìn)行在原來基礎(chǔ)的修改,而是在原來基礎(chǔ)上進(jìn)行迭代和更新。

進(jìn)一步認(rèn)識(shí)和理解多態(tài)

場(chǎng)景:畫一個(gè)圖形

class Shape{//創(chuàng)建一個(gè)圖形類---->作為多種圖形的父類
    public int length;//圖形的長(zhǎng)
    public int wide;//圖形的寬
    public int height;//圖形的高
    public void draw() {
        System.out.println("我要畫一個(gè)圖形?。?!");
    }
}
class rectangle extends Shape{//長(zhǎng)方形
    @Override
    public void draw() {
        System.out.println("我要畫一個(gè)長(zhǎng)方形?。?!");
    }
}
class square extends Shape{
    @Override
    public void draw() {
        System.out.println("我要畫一個(gè)正方形?。?!");
    }
}
class circular extends Shape{
    @Override
    public void draw() {
        System.out.println("我要畫一個(gè)圓形?。?!");
    }
}
public class TestDemo1 {
    public static void method(Shape shape) {
        shape.draw();
    }
    public static void main(String[] args) {
        Shape shape1 = new circular();
        Shape shape2 = new rectangle();
        Shape shape3 = new square();
        method(shape1);
        method(shape2);
        method(shape3);
    }
}

創(chuàng)建一個(gè)Shape(父類),然后創(chuàng)建三個(gè)子類分別是square ,circular,rectangle,利用父類引用這三個(gè)子類,接著調(diào)用method方法。

這就是多態(tài),不同的對(duì)象,調(diào)用同一個(gè)方法最后結(jié)果產(chǎn)生出不同的狀態(tài)。

我們?cè)賮砜偨Y(jié)多態(tài)產(chǎn)生的條件:

  • 要在繼承體系下
  • 子類要對(duì)父類的方法進(jìn)行重寫
  • 通過父類的引用調(diào)用重寫的方法 

也就是 在繼承體系下  進(jìn)行向上轉(zhuǎn)型  和 方法重寫

多態(tài)的優(yōu)點(diǎn)

優(yōu)點(diǎn):

  • 能夠降低代碼的 "圈復(fù)雜度", 避免使用大量的 if - else
  • 如果使用多態(tài), 則不必寫這么多的 if - else 分支語句, 代碼更簡(jiǎn)單.
  • 可擴(kuò)展能力更強(qiáng)

缺點(diǎn):

  • 代碼的運(yùn)行效率降低

還有一個(gè)重要點(diǎn)就是不要在構(gòu)造方法中調(diào)用重寫方法

到此這篇關(guān)于Java全面分析面向?qū)ο笾鄳B(tài)的文章就介紹到這了,更多相關(guān)Java多態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之養(yǎng)老院管理系統(tǒng)的實(shí)現(xiàn)

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+JSP+Easyui+maven+mysql實(shí)現(xiàn)一個(gè)養(yǎng)老院管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2022-03-03
  • java實(shí)現(xiàn)五子棋大戰(zhàn)

    java實(shí)現(xiàn)五子棋大戰(zhàn)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)五子棋大戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例

    springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例

    我們見過的很多網(wǎng)站,容許使用第三方賬號(hào)登錄,oauth2是用來做三方登錄的,本文就詳細(xì)的介紹springboot oauth2實(shí)現(xiàn)單點(diǎn)登錄實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-01-01
  • 一文搞懂Spring中的注解與反射

    一文搞懂Spring中的注解與反射

    這篇文章主要為大家介紹了Spring中的注解與反射的原理與實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們了解Spring有一定的幫助,需要的可以參考一下
    2022-06-06
  • Spring Boot 集成Dubbo框架實(shí)例

    Spring Boot 集成Dubbo框架實(shí)例

    本篇文章主要介紹了Spring Boot 集成Dubbo框架實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • Java excel數(shù)據(jù)導(dǎo)入mysql的實(shí)現(xiàn)示例詳解

    Java excel數(shù)據(jù)導(dǎo)入mysql的實(shí)現(xiàn)示例詳解

    今天教大家如何使用Java將excel數(shù)據(jù)導(dǎo)入MySQL,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴呢很有幫助,需要的朋友可以參考下
    2022-08-08
  • hadoop實(shí)現(xiàn)grep示例分享

    hadoop實(shí)現(xiàn)grep示例分享

    這篇文章主要介紹了hadoop實(shí)現(xiàn)grep示例,可從文檔中提取包含某些字符串的行,需要的朋友可以參考下
    2014-03-03
  • 詳解IDEA使用Maven項(xiàng)目不能加入本地Jar包的解決方法

    詳解IDEA使用Maven項(xiàng)目不能加入本地Jar包的解決方法

    這篇文章主要介紹了詳解IDEA使用Maven項(xiàng)目不能加入本地Jar包的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性

    使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性

    這篇文章主要介紹了使用JAXBContext 設(shè)置xml節(jié)點(diǎn)屬性的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • JVM類加載機(jī)制原理及用法解析

    JVM類加載機(jī)制原理及用法解析

    這篇文章主要介紹了JVM類加載機(jī)制原理及用法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論