參考鏈接: 可以在Java中重載或重寫靜態方法嗎
Java中的靜態方法不能被子類重寫
?
特點:靜態方法屬于類的方法,也屬于對象的方法,但是靜態方法隨類的存在。
結論:Java中的靜態方法不能被子類重寫,實際上,子類的靜態方法隱藏了父類的靜態方法,因此父類的子類的靜態方法同時存在,只不過父類通過類名(或對象名)調用的是父類的靜態方法,子類通過類名(或對象名)調用的是子類的靜態方法。
?
(1)代碼如下:
public class Test {
? ? public static void main(String[] args) {
? ? ? ? Father f1 = new Son();
? ? ? ? f1.methon();? ? ? ? ? ? // static(靜態)方法的調用,不支持多態,所以此處調用的父類的靜態方法
? ? ? ? f1.doWork();? ? ? ? ? ? // 非static(靜態)方法的調用,支持多態
? ??????
? ? ? ? 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()");
? ? }
}
打印結果:
Father static methon()
Son doWork()
---------------
Son static methon()
Son doWork()
?
?
結論:
(1)靜態方法不支持多態。(final,private 方法也如此)
(2)靜態方法可通過類名直接調用,也可通過類的實例化對象調用,因此Father 的實例化對象f1調用的是父類(不是子類)的靜態方法。
(3)靜態方法的綁定時期為代碼的編譯器期,也叫前期綁定。非靜態的方法屬于程序的執行期綁定,也就運行期綁定。
?
?
對于結論(3)舉個極端的例子
public class Test {
? ? public static void main(String[] args) {
? ? ? ? Father f1 = new Son();
? ? ? ? f1.methon();? ? ? ? ? ? // static(靜態)方法的調用,不支持多態,所以此處調用的父類的靜態方法
? ? ? ? f1.doWork();? ? ? ? ? ? // 非static(靜態)方法的調用,支持多態
? ??????
? ? ? ? System.out.println("---------------");
? ??????
? ? ? ? Son s1 =new Son();
? ? ? ? s1.methon();
? ? ? ? s1.doWork();
? ??????
? ? ? ? System.out.println("---------------");
? ??????
? ? ? ? Father f2= null;? ?// 創建一個父類變量的空引用
? ? ? ? f2.methon();? ? ? ?// 調用父類的靜態方法,此處竟然不出錯,表明了靜態方法的特殊性
? ? }
?
}
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()");
? ? }
}打印結果:
?
Father static methon()
Son doWork()
---------------
Son static methon()
Son doWork()
---------------
Father static methon()