日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于java多态中覆盖的理解

發布時間:2024/10/12 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于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();} }

  運行結果是:

這是子類的普通方法
這是子類的普通方法

這就說明該變量是什么對象時,就調用什么方法,而與聲明變量的類無關。

    但是更神奇的在這里:

public class Ancestors {//父類變量public void common() {System.out.println("這是父類的common方法");}public void anceshow() {common();} } public class Derive extends Ancestors{//子類變量public void common() {//覆蓋父類的同名方法System.out.println("這是子類的common方法");}public void deriveShow() {anceshow(); }public static void main(String args[]) {Ancestors oa = new Ancestors();oa.anceshow();//執行的是父類的方法Derive ob = new Derive();ob.deriveShow();//執行的是子類的方法 } }

運行結果:

這是父類的common方法
這是子類的common方法

  神奇之處就在于ob.deriveshow執行是調用的父類的anceshow方法,而在執行anceshow方法時并未調用父類的common方法,而是返回到子類中執行子類的common方法,相當于自己出去了一圈又找回來了

補充:

討論完方法后,你是否對于成員變量是否也具有多態性有疑問?

  這里就不補充源代碼了,明確的說,對于成員變量而言無論是實例,靜態成員,都沒有這一特性,對成員變量的引用在編譯時就已經確定好了,即聲明的變量為那個類,這個成員變量就屬于哪個類。

轉載于:https://www.cnblogs.com/gambler/p/8585270.html

總結

以上是生活随笔為你收集整理的关于java多态中覆盖的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。