本題考察 靜態方法隱藏 與 實例方法重寫 的多態行為差異,是 Java 基礎面試高頻考點。
package Nov2016;
public class Ques1124 {
public static void main(String[] args) {
Parent p = new Sub();
p.staticMethod(); // 調用靜態方法
p.instanceMethod(); // 調用實例方法
}
}
class Parent {
public static void staticMethod() {
System.out.println("父類靜態方法");
}
public void instanceMethod() {
System.out.println("父類非靜態方法");
}
}
class Sub extends Parent {
// 子類同名靜態方法(方法隱藏)
public static void staticMethod() {
System.out.println("子類靜態方法");
}
@Override
public void instanceMethod() {
System.out.println("子類非靜態方法");
}
}
父類靜態方法 子類非靜態方法
p.staticMethod() 編譯期根據引用類型(Parent)綁定,運行期不發生多態。Parent.staticMethod()、Sub.staticMethod(),避免通過實例引用調用造成誤解。p.instanceMethod() 運行期根據對象實際類型(Sub)分派,體現多態。@Override 註解可編譯期校驗重寫規則(簽名一致、返回類型協變、拋出異常子類化、訪問權限不降低)。invokevirtual,需在運行期通過對象頭的類指針查找方法表確定具體實現。final 禁用動態分派,編譯期直接內聯或解析為直接引用。this 引用上下文。Static method called via instance 檢查。