概念:
乙個事物的多種形態
多型前提和體現
1.有繼承關係或者實現關係
2.有方法重寫
3.有父類引用指向子類物件
//父類
public class fu
}//子類
public class zi extends fu
}public class demo
}
1.提高了程式的維護性(由繼承保證)
我的理解:
1.如果是多型的形式,可以利用子類的方法覆蓋進行後期的維護
(因為在多型中子類的存在就是為了方法覆蓋,
所以子類的**會比較少,修改起來也比較清晰)
2.如果不是多型形式,只能在父類大批量的**中進行修改
提高了程式的擴充套件性(由多型保證)
例如:
public void show(object obj)
如果乙個方法接收的引數是乙個父類,那麼多型就已經形成了。
這個父類的所有子類都可以傳進 這個方法。
泛型可以對此進行限定。
多型的弊端:
父類不能訪問子類的特有方法
如果非要訪問,向下轉型(強轉)
zi zi=(zi) fu;//fu為多型物件
執行流程:
//父類
public class fu
public string show()
}//子類
public class zi extends fu
// 覆蓋了父類的show方法
public string show()
}public class demo
}
main方法壓棧後,用父類引用建立子類物件。
其實不用父類的引用程式的結果也是一樣的。
建立子類物件可以理解為--呼叫子類的構造方法。
而子類的構造方法的第乙個語句是super();
這是隱式的語句,和構造方法一樣,你不寫編譯器幫你寫。
它的存在造成了父類的構造方法先執行,
相當於子類的構造方法還沒執行就掉用了父類的構造方法。
因此,父類構造方法壓棧了,壓棧之後它先執行super();
之後將 i 賦值為6。
並且它的輸出語句先得到執行。
但它的輸出語句中用到了show()方法,它需要先從show()方法中得到返回值。
那麼問題來了,到底呼叫哪乙個show()方法?
這就要先說乙個問題,是誰在掉用show()方法呢?
其實在show()的前面還隱藏了乙個關鍵字-----this.
那this代表誰呢?
誰把父類的構造方法拉進棧的this就代表誰。
也就是說show()方法是子類在掉用,它也壓棧了。
因為子類有show()方法,而且子類和父類還存在繼承關係,所以方法被覆蓋了。
而show()方法需要列印變數 i 但此時 子類中的 i 並沒有被賦值,
子類的super();語句結束之後才會將 i 賦值為8,
子類和父類定義了相同的變數,需要super.i呼叫才會使用父類的變數。
所以列印結果為:
zi----show-run0
列印完之後
因為show()方法是子類的,
所以將"zi"返回給了父類構造方法的輸出語句,
show()方法彈棧,
所以列印的第二句話是:
fu---runzi
父類構造方法彈棧。
子類的super();執行完畢,將 i 的值賦值為8。
之後輸出語句,呼叫show()方法(這裡也隱藏這this,只不過子類與掉用者不存在繼承關係,所以show()方法沒變),
show()列印語句:
zi----show-run8
列印之後將「zi」返回給構造方法的輸出語句-------彈棧
子類的構造方法列印:
zi----runzi
子類彈棧;
main方法建立物件完畢,將new zi();的位址值賦值給了fu;
main方法輸出語句,因為呼叫了fu.show(),所以先列印:
zi----
show-run8
之後列印:
mainzi
main方法彈棧,程式結束。
本人見解未必真實
java 基礎 多型
4.8 多型 定義 某一類事物的多種存在形態。例 動物中貓,狗。貓這個物件對應的型別是貓型別 貓 x new 貓 同時貓也是動物中的一種,也可以把貓稱為動物 動物 y new 貓 動物是貓和狗具體事物中抽取出來的父型別。父型別引用指向了子類物件。多型性簡單說就是乙個物件對應著不同型別。體現 父類或者...
java基礎多型
首先定義乙個boss,叫zeroboss,會使用各種兵器,收了兩個徒弟,並分別贈送他們一件兵器 package zzq public class zeroboss 然後定義乙個zero的徒弟一zeroone,會使用屠龍刀 package zzq public class zeroone extend...
Java基礎 多型
多型性是指允許不同型別的物件對同一訊息做出相應。具有靈活性 抽象 行為共享 共享的優勢,共享就意味著最大化利用和簡潔,還有就是載入速度。一 多型的作用 消除型別之間的耦合關係。即同一事件發生在不同的物件上會產生不同的結果。二 多型的實現形式 1.過載 發生在同乙個類中 2.覆蓋 發生在子類中 三 多...