在Java中,靜態(static)方法,是屬於類方法,可以通過類直接調用,當然也可以通過實例對象進行調用,但不建議,也沒必要。
相應的,有靜態變量,屬於類變量。
注意:
-
靜態方法是無法被重寫(Override)的,如果強行加上 @Override 注解,編譯時會報錯 “java: 方法不會覆蓋或實現超類型的方法”。
原因:重寫的作用是為了父類和子類的相同簽名的方法,具有不同的行為,從而實現了 多態 。但是靜態方法是被類直接調用的,和對象無關,不存在父子類對象之間的相同方法不同行為,所以也沒有多態。 -
子類可以直接調用父類的靜態方法。
雖說子類無法重寫父類的靜態方法,但是卻可以直接調用父類的靜態方法,調用方式是 子類名.父類靜態方法() ,當然,也可以 子類對象.父類靜態方法(),不過沒必要,也不建議。
經過親測。測試代碼如下:
// 省略 package
public class SuperClass {
public String m1() {
return "a1";
}
public static String m2() {
return "a2";
}
static class SubClass extends SuperClass {
@Override
public String m1() {
return "b1";
}
/* @Override 添加該注解后報錯:Method does not override method from its superclass(方法不會覆蓋或實現超類型的方法)
public static String m2() {
return "b2";
}
*/
}
public static void main(String[] args) {
// 按照習慣,應該命名為superClass。之所以命名為 superC,是為了更清楚地區分 子類名稱 和 子類對象名稱
SuperClass superC = new SuperClass();
// 父類對象 調用 普通方法 m1()
System.out.println(superC.m1());
// 父類 調用 靜態方法 m2()
System.out.println(SuperClass.m2());
// 父類對象 調用 靜態方法 m2(),可以,但沒必要,不建議
System.out.println(superC.m2());
// 按照習慣,應該命名為subClass。之所以命名為 subC,是為了更清楚地區分 子類名稱 和 子類對象名稱
SuperClass subC = new SubClass();
// 子類對象 調用被重寫的 普通方法 m1()
System.out.println(subC.m1());
// 子類 調用 靜態方法 m2(),其實是父類的 m2() 的行為
System.out.println(SubClass.m2());
// 子類對象 調用 靜態方法 m2(),可以,但沒必要,不建議
System.out.println(subC.m2());
}
}