关于java多态中覆盖的理解
在前面一篇文章中,我已經介紹了關于java多態中重載的理解與規則
所以這篇文章主要介紹多態中的覆蓋機制。
首先重載與覆蓋除了表現方式不同之外,還有運行時間上的不同,重載是在編譯期間就已經可以確定好調用的方法,而覆蓋則是在運行期間才能確定。(這是由于覆蓋是一般是建立在繼承之上的,即需要通過繼承鏈(指針)的查找)
多態覆蓋的主要難度表現在:
對于一個父類變量,引用的是子類對象,那么需要知道父類變量在調用方法時,調用的是誰的方法。
一、實例方法在運行多態時的表現
這是父類方法
public class Forefather {public void normal() {System.out.println("這是父類的普通方法");} }?
這是子類方法
public class Inheritor extends Forefather{public void normal() {//這里覆蓋了父類的同名方法System.out.println("這是子類的普通方法");}}多態表現
public class ShowStrange {public static void main(String args[]) {Forefather pfather;//定義一個父類變量Inheritor pson;//定義一個子類變量pfather = new Inheritor();//創建子類對象pfather.normal();//調用子類方法 // pson = new Forefather();子類的變量不能創建父類對象pson = new Inheritor();pson.normal();} }運行結果是:
這是子類的普通方法
這是子類的普通方法
這就說明該變量是什么對象時,就調用什么方法,而與聲明變量的類無關。
但是更神奇的在這里:
運行結果:
這是父類的common方法
這是子類的common方法
神奇之處就在于ob.deriveshow執行是調用的父類的anceshow方法,而在執行anceshow方法時并未調用父類的common方法,而是返回到子類中執行子類的common方法,相當于自己出去了一圈又找回來了
補充:
討論完方法后,你是否對于成員變量是否也具有多態性有疑問?
這里就不補充源代碼了,明確的說,對于成員變量而言無論是實例,靜態成員,都沒有這一特性,對成員變量的引用在編譯時就已經確定好了,即聲明的變量為那個類,這個成員變量就屬于哪個類。
轉載于:https://www.cnblogs.com/gambler/p/8585270.html
總結
以上是生活随笔為你收集整理的关于java多态中覆盖的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 加盟蜀辣居鲜货火锅有哪些优势呢?了解过没
- 下一篇: 100克黄豆做豆腐脑放多少玉米淀粉?