淺談Java方法調(diào)用的優(yōu)先級問題
實現(xiàn)Java多態(tài)性的時候,關(guān)于方法調(diào)用的優(yōu)先級:
我們這樣假設(shè)下,super(超類)、this(當(dāng)前類對象)、show(方法)、object(對象),方法調(diào)用優(yōu)先順序: ①this.show(object)>②super.show(object)> ③this.show((super)object)>④super.show((super)object)
先看以下代碼
class ParentCls {public String show(ChildA obj){return 'Parent and ChildA';}public String show(ParentCls obj) {return 'Parent';}}
然后寫一個子類ChildA ,繼承ParentCls :
class ChildA extends ParentCls{public String show(ChildA obj) {return 'ChildA';};public String show(ParentCls obj) {return 'ChildA and Parent';};}
寫一個子類ChildB,繼承ChildA :
class ChildB extends ChildA{
}
測試下
public static void main(String[] args) {ParentCls p1 = new ParentCls();ParentCls p2 = new ChildA();ChildA a = new ChildA();ChildB b = new ChildB();System.out.println(p1.show(a));System.out.println(b.show(a));System.out.println(a.show(b));System.out.println(p2.show(a));}
輸出
Parent and ChildAChildAChildAChildA
第一個輸出,p1是ParentCls的實例,且類ParentCls中有show(ChildA obj)方法,直接執(zhí)行該方法, ①有效;
第二個輸出,b是ChildB 的實例,類ChildB 中沒有show(ChildA obj)方法,①無效,再從ChildB 的父類ChildA查找,ChildA中剛好有show(ChildA obj)方法,②有效;
第三個輸出,a是ChildA的實例,b是ChildB的實例,類ChildA中沒有show(ChildB obj)方法,①無效,再從ChildA的父類ParentCls入手,ParentCls中也沒有show(ChildB obj)方法,②無效,從ChildB的父類入手,(super)ChildB 即是ChildA,所以a.show(b)=>a.show(a),ChildA中剛好有show(ChildA obj)方法,③有效;
④就不作演示,根據(jù)①②③很容易得出結(jié)論;
第四個輸出,體現(xiàn)Java多態(tài)性,符合①,但是p2是引用類ChildA的一個對象 ,ChildA 重寫覆蓋了ParentCls的show()方法,所以執(zhí)行ChildA 的show()方法;
補(bǔ)充知識:Java中關(guān)于靜態(tài)塊,初始化快,構(gòu)造函數(shù)的執(zhí)行順序
代碼如下:
public class ParentDemo { static { System.out.println('this is ParentDemo static'); } { System.out.println('this is ParentDemo code block'); } public ParentDemo() { System.out.println('this is ParentDemo constructor'); }}public class SonDemo extends ParentDemo{ static { System.out.println('this is SonDemo static'); } { System.out.println('this is SonDemo code block'); } public SonDemo() { System.out.println('this is SonDemo constructor'); }}public class TestMain { public static void main(String[] args){ new SonDemo(); }}
輸出結(jié)果:
this is ParentDemo staticthis is SonDemo staticthis is ParentDemo code blockthis is ParentDemo constructorthis is SonDemo code blockthis is SonDemo constructor
由上可見,Java中 靜態(tài)塊中的代碼在類加載時執(zhí)行,子類繼承父類。會按照繼承的順序先執(zhí)行靜態(tài)代碼塊。當(dāng)實例化對象的時候,同理會按照繼承的順序依次執(zhí)行如下代碼:
代碼塊,構(gòu)造函數(shù),當(dāng)父類的執(zhí)行完以后,再執(zhí)行子類。
以上這篇淺談Java方法調(diào)用的優(yōu)先級問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. vue實現(xiàn)web在線聊天功能2. 完美解決vue 中多個echarts圖表自適應(yīng)的問題3. JavaScript實現(xiàn)頁面動態(tài)驗證碼的實現(xiàn)示例4. 解決Android Studio 格式化 Format代碼快捷鍵問題5. JavaEE SpringMyBatis是什么? 它和Hibernate的區(qū)別及如何配置MyBatis6. Java使用Tesseract-Ocr識別數(shù)字7. Python使用urlretrieve實現(xiàn)直接遠(yuǎn)程下載圖片的示例代碼8. 在Chrome DevTools中調(diào)試JavaScript的實現(xiàn)9. Springboot 全局日期格式化處理的實現(xiàn)10. SpringBoot+TestNG單元測試的實現(xiàn)
