搜尋
首頁Javajava教程Java物件導向之多型實例分析

Java物件導向之多型實例分析

Apr 19, 2023 pm 01:34 PM
java

    多態的理解

    什麼是多態呢? ?從字面理解就是多種形態,也就是不同類別實例化出來的物件呼叫同一種方法,也可以理解為不同類別的物件經過同一種行為產生的狀態是不同的,這就是多態。

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

    向轉型

    首先多態的前提是繼承,那既然是繼承,那就一定就有父類別與子類別這樣的關係。

    我們再來回憶一下怎麼建立子類別物件和父類別物件。

    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();
        }
    }

    這裡就創建了貓這個類別然後繼承了Animal類別。我們實例化貓和Animal這個物件就可以呼叫方法和屬性。

    那何為向上轉型呢? ? ?

    原本子類別物件的引用引用子類別的對象,現在讓父類別的引用引用子類別物件這就是向上轉型。

    Java物件導向之多型實例分析

    我們利用程式碼理解:

    Java物件導向之多型實例分析

    # 這就是向轉型,我們也可以利用animal這個父類別引用呼叫方法;

    Java物件導向之多型實例分析

     這時我們會發現利用這個引用能夠呼叫父類別的方法和屬性,但是不能夠呼叫子類別的方法和屬性,那為什麼呢? ?原因就是因為父類別沒有子類別這個方法,所以不能呼叫。總結:向上轉型的時候也就是父類別引用引用子類別對象,這個父類別引用只能呼叫父類別有的屬性和方法,不能呼叫子類別的。

    向轉型的三種形式

    第一種:直接賦值

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

      Animal animal1 = new Cat();//父类对象的引用 引用子类对象--->向上转型
      Animal animal2 = new Dog();

    第二種:作為方法參數:

    Java物件導向之多型實例分析

      第三種作為回傳值:

    Java物件導向之多型實例分析

    我們回到剛才的列印結果是什麼;

    Java物件導向之多型實例分析

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

    但是這就會出現一個問題,如果我在創建一個狗類,然後在調用eat方法  難道狗也要吃貓糧麼?這就會出現問題,那我們可以在子類別中寫一個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();//父类对象的引用 引用子类对象--->向上转型
            Animal animal2 = new Dog();//父类对象的引用 引用子类对象--->向上转型
            animal1.name = "小猫";//访问父类属性
            animal2.name = "小狗";//访问父类属性
            animal1.eat();
            animal2.eat();
            // animal.mew();//访问子类特有的方法
        }
    }

     這時又創建了一個狗類,然後又分別在兩個子類別中建立兩個eat方法。

    Java物件導向之多型實例分析

     我們發現這時候就變得很清楚就達到我們想要的效果了。

    但我們又應該想一想,為什麼呼叫子類別的eat方法而不呼叫父類別的?

    動態綁定和靜態綁定

    此時其實發生了動態綁定,我們可以看一下字節碼文件,打開powershell窗口

    Java物件導向之多型實例分析

    #我們都知道執行一個程式是先編譯後運行,而這個是在編譯的時候調用的是Animal的eat方法,而在運行的時候是調用的是Cat的方法這就是我們所說的運行時綁定或可以說是動態綁定。

    那既然有動態綁定那肯定也有靜態綁定。

    動態綁定是在編譯的時候呼叫一個方法,而在執行時才是最後要確定呼叫的方法,也就是在執行時決定要呼叫那個方法。

    靜態綁定就是在編譯期間已經確定要呼叫哪個方法。

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

    靜態綁定最顯著的代表就是方法重載。

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

    Java物件導向之多型實例分析

    方法的重寫

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

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

    方法重寫滿足 方法名稱相同,方法的參數清單相同,方法的回傳值相同。

    Java物件導向之多型實例分析

     我們也可以一鍵產生重寫 

    #

    Java物件導向之多型實例分析

     有几个注意事项:

    Java物件導向之多型實例分析

     不能重写被private修饰的方法。

    Java物件導向之多型實例分析

     不能重写被final修饰的方法。

    Java物件導向之多型實例分析

     子类的方法的访问权限一定要大于等于父类的访问权限。

    Java物件導向之多型實例分析

    重写的方法, 可以使用 @Override 注解来显式指定. 有了这个注解能帮我们进行一些合法性校验. 例如不小心将方法名字拼写错了 (比如写成eat), 那么此时编译器就会发现父类中没有 aet 方法, 就会编译报错, 提示无法构成重写.

    Java物件導向之多型實例分析

    被static修饰的方法也不能被重写 

    总结方法重写的注意事项:

    • 被private,final修饰的方法不能被重写。

    • 被staitc修饰的方法也不能被重写。

    • @override 可以检查你重写的方法名是否正确,最好要加上。

    • 方法重写一定满足方法名相同,参数列表相同,返回值相同。

    对比方法重写与方法重载:

    Java物件導向之多型實例分析

    最后:重写不是进行在原来基础的修改,而是在原来基础上进行迭代和更新。

    进一步认识和理解多态

    场景:画一个图形

    class Shape{//创建一个图形类---->作为多种图形的父类
        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("我要画一个正方形!!!");
        }
    }
    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);
        }
    }

    创建一个Shape(父类),然后创建三个子类分别是square ,circular,rectangle,利用父类引用这三个子类,接着调用method方法。

    Java物件導向之多型實例分析

    这就是多态,不同的对象,调用同一个方法最后结果产生出不同的状态。

    我们再来总结多态产生的条件:

    • 要在继承体系下

    • 子类要对父类的方法进行重写

    • 通过父类的引用调用重写的方法 

    也就是 在继承体系下  进行向上转型  和 方法重写

    多态的优点

    优点:

    • 能够降低代码的 "圈复杂度", 避免使用大量的 if - else

    • 如果使用多态, 则不必写这么多的 if - else 分支语句, 代码更简单.

    • 可扩展能力更强

    缺点:

    • 代码的运行效率降低

    还有一个重要点就是不要在构造方法中调用重写方法

    以上是Java物件導向之多型實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

    新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

    JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

    不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

    平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

    平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

    Java的平台獨立性如何促進代碼重用?Java的平台獨立性如何促進代碼重用?Apr 24, 2025 am 12:05 AM

    Java'splatformindependencefacilitatescodereusebyallowingbytecodetorunonanyplatformwithaJVM.1)Developerscanwritecodeonceforconsistentbehavioracrossplatforms.2)Maintenanceisreducedascodedoesn'tneedrewriting.3)Librariesandframeworkscanbesharedacrossproj

    您如何在Java應用程序中對平台特定問題進行故障排除?您如何在Java應用程序中對平台特定問題進行故障排除?Apr 24, 2025 am 12:04 AM

    要解決Java應用程序中的平台特定問題,可以採取以下步驟:1.使用Java的System類查看系統屬性以了解運行環境。 2.利用File類或java.nio.file包處理文件路徑。 3.根據操作系統條件加載本地庫。 4.使用VisualVM或JProfiler優化跨平台性能。 5.通過Docker容器化確保測試環境與生產環境一致。 6.利用GitHubActions在多個平台上進行自動化測試。這些方法有助於有效地解決Java應用程序中的平台特定問題。

    JVM中的類加載程序子系統如何促進平台獨立性?JVM中的類加載程序子系統如何促進平台獨立性?Apr 23, 2025 am 12:14 AM

    類加載器通過統一的類文件格式、動態加載、雙親委派模型和平台無關的字節碼,確保Java程序在不同平台上的一致性和兼容性,實現平台獨立性。

    Java編譯器會產生特定於平台的代碼嗎?解釋。Java編譯器會產生特定於平台的代碼嗎?解釋。Apr 23, 2025 am 12:09 AM

    Java編譯器生成的代碼是平台無關的,但最終執行的代碼是平台特定的。 1.Java源代碼編譯成平台無關的字節碼。 2.JVM將字節碼轉換為特定平台的機器碼,確保跨平台運行但性能可能不同。

    JVM如何處理不同操作系統的多線程?JVM如何處理不同操作系統的多線程?Apr 23, 2025 am 12:07 AM

    多線程在現代編程中重要,因為它能提高程序的響應性和資源利用率,並處理複雜的並發任務。 JVM通過線程映射、調度機制和同步鎖機制,在不同操作系統上確保多線程的一致性和高效性。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    強大的PHP整合開發環境

    Dreamweaver Mac版

    Dreamweaver Mac版

    視覺化網頁開發工具

    VSCode Windows 64位元 下載

    VSCode Windows 64位元 下載

    微軟推出的免費、功能強大的一款IDE編輯器

    Atom編輯器mac版下載

    Atom編輯器mac版下載

    最受歡迎的的開源編輯器

    SecLists

    SecLists

    SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。