Java編程學(xué)習(xí):父類靜態(tài)方法可以重寫嗎?

Java是一種可以撰寫跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。Java 技術(shù)具有卓越的通用性、高效性、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC、數(shù)據(jù)中心、游戲控制臺(tái)、科學(xué)超級(jí)計(jì)算機(jī)、移動(dòng)電話和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專業(yè)社群。

給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫(kù)-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四,六零七 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

重寫(Override)作為Java的特性之一,經(jīng)常被作為面試問(wèn)題。

比較坑的一個(gè)問(wèn)題是,子類能否重寫父類的靜態(tài)方法?

答案當(dāng)然是可以的。但是重寫之后會(huì)發(fā)生什么,是否調(diào)用子類靜態(tài)方法會(huì)執(zhí)行子類的邏輯,這才是坑所在的地方。

重寫

回顧一下Override的定義,重寫是對(duì)父類允許訪問(wèn)的方法的實(shí)現(xiàn)邏輯進(jìn)行重新編寫。但是不能改變方法的返回值和參數(shù)內(nèi)容。

從它的特點(diǎn)上來(lái)說(shuō),重寫允許子類對(duì)象擁有自己的實(shí)現(xiàn)邏輯。從這個(gè)角度來(lái)說(shuō),重寫靜態(tài)方法是不允許的。

重寫靜態(tài)方法會(huì)發(fā)生什么?

雖然原則上不允許重寫靜態(tài)方法,但是,

編譯器是不會(huì)報(bào)錯(cuò)的

那么重寫之后會(huì)發(fā)生什么呢?來(lái)看這么一段代碼

class SuperClass { public static void staticMethod() { System.out.println("SuperClass: inside staticMethod"); } public static void main(String []args){ SuperClass superClassWithSuperCons = new SuperClass(); SuperClass childClassWithSubCons = new ChildClass(); ChildClass childClassWithChildCons = new ChildClass(); superClassWithSuperCons.staticMethod(); childClassWithSubCons.staticMethod(); childClassWithChildCons.staticMethod(); } } class ChildClass extends SuperClass{//overriding the static method public static void staticMethod(){ System.out.println("ChildClass: inside staticMethod"); } } }

輸出結(jié)果是

SuperClass: inside staticMethod

SuperClass: inside staticMethod

ChildClass: inside staticMethod

第二行輸出說(shuō)明,即使重寫了靜態(tài)方法,執(zhí)行的還是父類的邏輯。

這也就證明了,靜態(tài)方法是在編譯時(shí)使用了編譯類信息,進(jìn)行靜態(tài)綁定的。它和對(duì)象無(wú)關(guān),而和類有關(guān)。

小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 六五零,五五四,六零七 】,無(wú)論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享!

總結(jié)

對(duì)于靜態(tài)方法,我們不應(yīng)該嘗試去重寫,而且調(diào)用時(shí)應(yīng)該以類進(jìn)行調(diào)用,而不是對(duì)象進(jìn)行調(diào)用。

重寫,說(shuō)的是根據(jù)運(yùn)行時(shí)的對(duì)象類型來(lái)決定調(diào)用哪個(gè)方法,而不是編譯時(shí)類型。靜態(tài)方法是屬于類的方法,在編譯階段就確定了。因此即使重寫了也沒(méi)意義。

如果這樣說(shuō)的不夠明白,可以回想平時(shí)開(kāi)發(fā)中我們經(jīng)常用的工廠模式,或者面向接口編程。我們經(jīng)常會(huì)用父類來(lái)聲明一個(gè)對(duì)象,而對(duì)象是在運(yùn)行時(shí)才確定的,這就是運(yùn)行時(shí)重寫的意義所在。而對(duì)于靜態(tài)方法的調(diào)用,雖然Java允許通過(guò)對(duì)象來(lái)調(diào)用,但只是為了開(kāi)發(fā)方便,正確的姿勢(shì)是通過(guò)類來(lái)調(diào)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容