[转载] Java中的静态方法不能被子类重写
參考鏈接: 可以在Java中重載或重寫(xiě)靜態(tài)方法嗎
Java中的靜態(tài)方法不能被子類(lèi)重寫(xiě)
?
特點(diǎn):靜態(tài)方法屬于類(lèi)的方法,也屬于對(duì)象的方法,但是靜態(tài)方法隨類(lèi)的存在。
結(jié)論:Java中的靜態(tài)方法不能被子類(lèi)重寫(xiě),實(shí)際上,子類(lèi)的靜態(tài)方法隱藏了父類(lèi)的靜態(tài)方法,因此父類(lèi)的子類(lèi)的靜態(tài)方法同時(shí)存在,只不過(guò)父類(lèi)通過(guò)類(lèi)名(或?qū)ο竺?#xff09;調(diào)用的是父類(lèi)的靜態(tài)方法,子類(lèi)通過(guò)類(lèi)名(或?qū)ο竺?#xff09;調(diào)用的是子類(lèi)的靜態(tài)方法。
?
(1)代碼如下:
public class Test {
? ? public static void main(String[] args) {
? ? ? ? Father f1 = new Son();
? ? ? ? f1.methon();? ? ? ? ? ? // static(靜態(tài))方法的調(diào)用,不支持多態(tài),所以此處調(diào)用的父類(lèi)的靜態(tài)方法
? ? ? ? f1.doWork();? ? ? ? ? ? // 非static(靜態(tài))方法的調(diào)用,支持多態(tài)
? ??????
? ? ? ? System.out.println("---------------");
? ??????
? ? ? ? Son s1 =new Son();
? ? ? ? s1.methon();
? ? ? ? s1.doWork();
? ? }
?
}
class Father {
? ? public static void methon(){
? ? ? ? System.out.println("Father static methon()");
? ? }
? ??
? ? public void doWork(){
? ? ? ? System.out.println("Father doWork()");
? ? }
}
?
class Son extends Father {
? ? public static void methon(){
? ? ? ? System.out.println("Son static methon()");
? ? }
? ? public void doWork(){
? ? ? ? System.out.println("Son doWork()");
? ? }
}
打印結(jié)果:
Father static methon()
Son doWork()
---------------
Son static methon()
Son doWork()
?
?
結(jié)論:
(1)靜態(tài)方法不支持多態(tài)。(final,private 方法也如此)
(2)靜態(tài)方法可通過(guò)類(lèi)名直接調(diào)用,也可通過(guò)類(lèi)的實(shí)例化對(duì)象調(diào)用,因此Father 的實(shí)例化對(duì)象f1調(diào)用的是父類(lèi)(不是子類(lèi))的靜態(tài)方法。
(3)靜態(tài)方法的綁定時(shí)期為代碼的編譯器期,也叫前期綁定。非靜態(tài)的方法屬于程序的執(zhí)行期綁定,也就運(yùn)行期綁定。
?
?
對(duì)于結(jié)論(3)舉個(gè)極端的例子
public class Test {
? ? public static void main(String[] args) {
? ? ? ? Father f1 = new Son();
? ? ? ? f1.methon();? ? ? ? ? ? // static(靜態(tài))方法的調(diào)用,不支持多態(tài),所以此處調(diào)用的父類(lèi)的靜態(tài)方法
? ? ? ? f1.doWork();? ? ? ? ? ? // 非static(靜態(tài))方法的調(diào)用,支持多態(tài)
? ??????
? ? ? ? System.out.println("---------------");
? ??????
? ? ? ? Son s1 =new Son();
? ? ? ? s1.methon();
? ? ? ? s1.doWork();
? ??????
? ? ? ? System.out.println("---------------");
? ??????
? ? ? ? Father f2= null;? ?// 創(chuàng)建一個(gè)父類(lèi)變量的空引用
? ? ? ? f2.methon();? ? ? ?// 調(diào)用父類(lèi)的靜態(tài)方法,此處竟然不出錯(cuò),表明了靜態(tài)方法的特殊性
? ? }
?
}
class Father {
? ? public static void methon(){
? ? ? ? System.out.println("Father static methon()");
? ? }
? ??
? ? public void doWork(){
? ? ? ? System.out.println("Father doWork()");
? ? }
}
?
class Son extends Father {
? ? public static void methon(){
? ? ? ? System.out.println("Son static methon()");
? ? }
? ? public void doWork(){
? ? ? ? System.out.println("Son doWork()");
? ? }
}打印結(jié)果:
?
Father static methon()
Son doWork()
---------------
Son static methon()
Son doWork()
---------------
Father static methon()
總結(jié)
以上是生活随笔為你收集整理的[转载] Java中的静态方法不能被子类重写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: [转载] JAVA笔记_(Day04,D
 - 下一篇: [转载] java synchroniz