一、多態的語法 1.關於多態中涉及到幾個概念 (1)向上轉型(upcasting) 子類型轉換為父類型,又被稱為自動類型轉換 (2)向下轉型(downcasting) 父類型轉換為子類型,又被稱為強制類型轉換(需要加強制類型轉換符) (3)無論是向上轉型還是向下轉型,它們之間都必須有繼承關係,否則編 ...
一、多態的語法
1.關於多態中涉及到幾個概念
(1)向上轉型(upcasting)
子類型轉換為父類型,又被稱為自動類型轉換
(2)向下轉型(downcasting)
父類型轉換為子類型,又被稱為強制類型轉換(需要加強制類型轉換符)
(3)無論是向上轉型還是向下轉型,它們之間都必須有繼承關係,否則編譯是不通過的。
(4)Java中允許語法:子類型向父類型及逆行轉化
2.過程:
(1)java程式分為編譯和運行階段
(2)先分析編譯階段,再分析運行階段,編譯無法通過,根本是無法運行的;
(3)編譯階段檢查a2這個引用的數據類型為Animal46,由於Animal.class位元組碼中有move()方法,所以編譯通過了,這個過程我i們稱為靜態綁定,編譯階段綁定,只有靜態綁定成功後才會有後續的運行。
(4)程式運行階段,JVM堆記憶體中真實創建的對象是Cat對象,那麼以下程式在運行階段一定會調用Cat對象的move()方法,此時發生了程式的靜態綁定。運行階段綁定。
(5)無論是Catc46類有沒有重寫move方法,運行階段一定會調用的是Cat對象的move方法,因為底層真實的對象就是Cat對象。
(6)父類型引用指向子類型對象這種機制導致了存在編譯階段綁定和運行階段綁定兩種不同的形態/狀態,這種機制可以成為一種多態語法機制。
package com.bjpowernode.java_learning; public class D46_1_polymorphic { public static void main(String[] args) { //下麵使用多態語法機制 Animal46 a2 = new Cat46();//一個Animal46類型的引用指向了Cat46對象 a2.move();//底層是Cat46對象,如果這個方法沒重寫,那麼就會調用Animal的原始move方法 //a2.catchMouse();//分析這行程式為什麼不能調用? //因為編譯階段編譯器檢查a2的類型是Animal類型,從Animal.class位元組碼文件之中查找catchMouse //方法,最終沒有找到該方法,導致靜態綁定失敗,沒有綁定成功,也就是編譯失敗,更別談運行了。 /** * Animal和Cat之間存在繼承關係,Animal是父類,Cat是子類 * Cat是Animal合理的 * new Cat()創建的對象類型是Cat,a2這個引用的數據類型是Animal,可見它們進行了類型轉換 * 子類型轉換為父類型,稱為向上轉型。 */ } } class Animal46{ public void move() { System.out.println("動物們再行走"); } } class Cat46 extends Animal46{ public void move() { System.out.println("小貓在行走"); }//重寫函數 //下麵是小貓類特有的函數 public void catchMouse() { System.out.println("小貓是會抓老鼠的"); } } class Bird46 extends Animal46{ public void move() { System.out.println("小鳥在飛翔"); } }
二、源碼:
D46_1_polymorphic.java
地址:
https://github.com/ruigege66/Java/blob/master/D46_1_polymorphic.java
2.CSDN:https://blog.csdn.net/weixin_44630050(心悅君兮君不知-睿)
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關註微信公眾號:傅里葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大數據學習資料