JAVA入门级教学之(多态)
生活随笔
收集整理的這篇文章主要介紹了
JAVA入门级教学之(多态)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JAVA入門級教學之(多態)
?
怎么理解多態:你本身就該喊你爹叫爹,你讓你爹叫你爹就是強制認做爹
?
?
多態的使用:
A? a = new D();
D類繼承A類,父類型引用指向子類型對象
?* 關于java語言匯總的多態語法機制:【只是多態的基礎語法,多態的作用后續說明】
?*?
?* ?? ?1.多態中設計的幾個概念
?*?
?* ?? ??? ?*向上轉型(upcasting)
?* ?? ??? ??? ?子類型轉父類型:自動類型轉換
?* ?? ??? ?
?* ?? ??? ?*向下轉型(downcasting)
?* ?? ??? ??? ?父類型轉子類型:強制類型轉換【需要加強制類型轉換符】
?*?
?* ?? ?2.無論是向上轉型還是向下轉型,兩種類型之間必須存在繼承關系
?*?
?* ?? ? ?*沒有繼承關系,程序是無法編譯通過的
?
代碼演示:
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------?
新建一個動物類?
package com.lbj.javase11;public class Animal {public void move(){System.out.println("動物都可以移動");}}新建一個鳥類繼承動物類?
package com.lbj.javase11;public class Bird extends Animal {public void move(){System.out.println("鳥會飛");}//子類特有的行為public void fly(){System.out.println("fly method");} }?新建一個貓類繼承動物類
package com.lbj.javase11;public class Cat extends Animal{//重寫父類中繼承過來的方法public void move(){System.out.println("貓會走貓步");}//不是父類中繼承過來的方法//這個方法是子類對象特有的行為【不是說所有的動物都能抓老鼠】public void catchMouse(){System.out.println("貓抓老鼠");} }?新建一個測試類:
package com.lbj.javase11; /*** 你本身就該就你爹叫爹,你讓你爹叫你爹就是強制認做爹* * 關于java語言匯總的多態語法機制:【只是多態的基礎語法,多態的作用后續說明】* * 1.多態中設計的幾個概念* * *向上轉型(upcasting)* 子類型轉父類型:自動類型轉換* * *向下轉型(downcasting)* 父類型轉子類型:強制類型轉換【需要加強制類型轉換符】* * 2.無論是向上轉型還是向下轉型,兩種類型之間必須存在繼承關系* * *沒有繼承關系,程序是無法編譯通過的* @author 14811****/ public class Test {public static void main(String[] args) {//使用多態語法機制/** 1.Animal和cat之間存在繼承關系,Animal是父類,Cat是子類* * 2.Cat is a Animal是合理的* * 3.new Cat() 創建的對象類型是Cat,a2這個引用的數據類型是Animal,可見* 它們進行了類型轉換:子類型轉換成父類型,稱為向上轉型/upcasting,稱為自動類型轉換* * 4.java中允許這種語法:父類型引用指向子類型對象 */Animal a2=new Cat();/** 1.java程序永遠都分為編輯階段和運行階段* * 2.先分析編譯階段,再分析運行階段,如果編譯無法通過,根本是無法運行的* * 3.編譯階段編譯器檢查a2這個引用的數據類型為Animal,由于Animal.class* 的字節碼中有move()方法,所以編譯通過了。這個過程我們稱為靜態綁定【編譯階段綁定】* 只有靜態綁定成功后才有后續的運行* * 4.在程序運行階段,JVM堆內存中真實創建的對象是Cat對象,那么以下程序在運行階段* 一定會調用Cat對象的move()方法,此時發生了程序的動態綁定【運行階段綁定】* * 5.無論是Cat類中有沒有重寫move方法,運行階段一定調用的是Cat對象的move方法,因為* 底層真實的對象就是Cat對象* * 6.父類型引用指向子類型對象這種機制導致程序存在編譯階段和運行階段綁定兩種不同的形態* 這種機制就叫做多態語法機制*/a2.move();/** 分析以下程序為什么不能調用:* 因為編譯階段編譯器檢查到a2的類型是Animal類型* 從Animal.class字節碼文件中查找catchMouse()方法,最終沒有找到該方法* 導致靜態綁定失敗,沒有綁定成功,也就是說編譯失敗了,更別說運行了*///a2.catchMouse();/** 假設想讓以上的對象執行catchMouse()方法 ,怎么辦?* a2是無法直接調用的,因為a2的類型Animal,Animal中沒有catchMouse()方法* 我們可以將a2強制類型轉換成Cat類型* a2的類型是Animal(父類),轉換成Cat類型(子類),被稱為向下轉型/downCasting/強制類型轉換* * 注:向下轉型也需要兩種類型之間必須有繼承關系,不然編譯報錯。強制類型轉換需要加強制類型轉換符** 什么時候需要使用向下轉型呢?* 當調用的方法是子類型中特有的,在父類型中不存在,必須進行向下轉型*/Cat c2=(Cat)a2;c2.catchMouse();//----------------------------------Animal a3=new Bird();/** 1.以下程序編譯是沒有問題的,因為編譯器檢查到a3的數據類型是Animal* Animal和Cat之間存在繼承關系,并且Animal是父類型,Cat是子類型* 父類型轉換成子類型叫做向下轉型,語法合格* * 2.雖然程序通過了,但是程序在運行階段會出現異常,因為JVM堆內存中* 真實存在的對象是Bird類型,Bird對象無法轉換成Cat對象,因為兩種* 類型之間不存在任何繼承關系,此時出現了著名的異常* java.lang.ClassCastException:* 類型轉換異常,這種異常總是在"向下轉型"的時候會發生*///Cat c3=(Cat)a3;//--------------------------------------------/** 1.以上異常只有在強制類型轉換的時候會發生,也就是說"向下轉型"存在隱患(編譯通過了,但是運行出錯了)* * 2.向上轉型只要編譯通過,運行一定不會出問題* * 3.向下轉型編譯通過,運行可能錯誤* * 4.怎么避免向下轉型出現 java.lang.ClassCastException:呢?* -使用instanceof運算符可以避免出現以上的異常* * 5.instanceof運算符怎么用?* -5.1語法格式:* (引用名 instanceof 數據類型名)* * -5.2以上運算符的執行結果類型是布爾類型,結果可能是true/false* * -5.3關于運算結果true/false* 假設:(a instanceof Animal)* true表示:* a這個引用指向的對象是一個Animal類型* false表示:* a這個引用指向的對象不是一個Animal類型* * 6.java規范中要求:在進行強制類型轉換之前,建議采用 instancsof運算符進行判斷,避免異常的發生*///當a3引用指向的對象卻是是一個Cat的時候【等同于:a3 是Cat的實例嗎? 】{ // Cat c3=(Cat)a3;//}if(a3 instanceof Cat){Cat c3=(Cat)a3;//這時候編譯器就會檢測}else if(a3 instanceof Bird){//a3確實是Bird類的,所以再強制轉換就會成功Bird b2=(Bird)a3;b2.fly();}}}?
總結
以上是生活随笔為你收集整理的JAVA入门级教学之(多态)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的模块提供了许多文件处理方法
- 下一篇: JAVA入门级教学之(文档里的is-a、