溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2022-04-26 08:12:51 來源:億速云 閱讀:236 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“Java面向?qū)ο笾鄳B(tài)實例分析”,在日常操作中,相信很多人在Java面向?qū)ο笾鄳B(tài)實例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java面向?qū)ο笾鄳B(tài)實例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    多態(tài)的理解

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

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

    向上轉(zhuǎn)型

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

    我們再來回憶一下怎么創(chuàng)建子類對象和父類對象。

    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();//實例化子類對象
             cat.name="mimi";
             Animal animal = new Animal();//實例化父類對象
             animal.eat();
        }
    }

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

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

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

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

    我們利用代碼理解一下:

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

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

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

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

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

    第一種:直接賦值

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

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

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

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

      第三種作為返回值:

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

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

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

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

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

    class Animal{
        public String name;//名字
        public int age;
        public void eat() {
            System.out.println(this.name+"要吃飯?。。?quot;);
        }
    }
    class Dog extends Animal{
        public void dark() {
            System.out.println("汪汪汪?。。?quot;);
        }
        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();//父類對象的引用 引用子類對象--->向上轉(zhuǎn)型
            Animal animal2 = new Dog();//父類對象的引用 引用子類對象--->向上轉(zhuǎn)型
            animal1.name = "小貓";//訪問父類屬性
            animal2.name = "小狗";//訪問父類屬性
            animal1.eat();
            animal2.eat();
            // animal.mew();//訪問子類特有的方法
        }
    }

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

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

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

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

    動態(tài)綁定和靜態(tài)綁定

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

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

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

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

    動態(tài)綁定是在編譯的時候調(diào)用一個方法,而在運行時才是最后要確定調(diào)用的方法,也就是在運行時確定要調(diào)用那個方法。

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

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

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

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

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

    方法的重寫

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

    方法重寫有幾點注意要求:

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

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

     我們也可以一鍵生成重寫 

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

     有幾個注意事項:

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

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

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

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

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

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

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

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

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

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

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

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

    • 被staitc修飾的方法也不能被重寫。

    • @override 可以檢查你重寫的方法名是否正確,最好要加上。

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

    對比方法重寫與方法重載:

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

    最后:重寫不是進行在原來基礎的修改,而是在原來基礎上進行迭代和更新。

    進一步認識和理解多態(tài)

    場景:畫一個圖形

    class Shape{//創(chuàng)建一個圖形類---->作為多種圖形的父類
        public int length;//圖形的長
        public int wide;//圖形的寬
        public int height;//圖形的高
        public void draw() {
            System.out.println("我要畫一個圖形?。?!");
        }
    }
    class rectangle extends Shape{//長方形
        @Override
        public void draw() {
            System.out.println("我要畫一個長方形!??!");
        }
    }
    class square extends Shape{
        @Override
        public void draw() {
            System.out.println("我要畫一個正方形!?。?quot;);
        }
    }
    class circular extends Shape{
        @Override
        public void draw() {
            System.out.println("我要畫一個圓形?。?!");
        }
    }
    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)建一個Shape(父類),然后創(chuàng)建三個子類分別是square ,circular,rectangle,利用父類引用這三個子類,接著調(diào)用method方法。

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

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

    我們再來總結(jié)多態(tài)產(chǎn)生的條件:

    • 要在繼承體系下

    • 子類要對父類的方法進行重寫

    • 通過父類的引用調(diào)用重寫的方法 

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

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

    優(yōu)點:

    • 能夠降低代碼的 "圈復雜度", 避免使用大量的 if - else

    • 如果使用多態(tài), 則不必寫這么多的 if - else 分支語句, 代碼更簡單.

    • 可擴展能力更強

    缺點:

    • 代碼的運行效率降低

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

    到此,關于“Java面向?qū)ο笾鄳B(tài)實例分析”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI