如何通過get,set方法訪問到父類的私有屬性


  剛學習繼承的時候,總是會有這樣的疑問。

  子類繼承父類時,會繼承所有的非私有的屬性和方法。那么在用set方法修改父類的私有屬性時,怎么沒有報空指針異常呢?

  后來仔細想過這個問題,既然沒有報空指針,那么在內存里這個屬性一定是存在的。那么問題又來了,既然都在內存為什么又不能訪問呢。百度了一下,原來在實例化子類的過程中,有一些有趣的東西。都知道在實例化子類之前,會先調用父類的構造方法。此時,就可以把子類的內存看做兩部分,一部分是父類,一部分是子類其本身super和this就分別指向這兩部分,this的權限相比於super要大一些,super只能訪問屬於父類的那塊區域,而this除了能訪問子類本身的那部分區域外,還能訪問super中那些沒有被private修飾的東西。這兒還有個有趣的東西,就是重寫,在父類變量引用子類實例的時候,為什么不能調用子類特有的方法的原因,通過上面的原因就很顯而易見了,那么為什么此時調父類的方法卻訪問的是子類重寫后的方法呢。原來,盡管變量是一個父類的對象,但實例出來的對象卻是子類的,在訪問方法時,會先掃描this指向的區域,如果在其中找到了就停止掃描,然后調用掃描到的方法,如果沒有找到那么就會掃描super執行的區域,如果找到就停止,然后執行,如果沒有找到就拋出異常。

  才疏學淺,若有不對,請留言指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM