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)用。



