Java靜態方法不具有多態性詳解

動態綁定機制使得基類的引用能夠指向正確的子類對象,從而使得面向基類編程成爲可能。

然而動態綁定在以下兩種情況會失效。

1、基類方法是private或final修飾的

這個很好理解,因爲private說明該方法對子類是不可見的,子類再寫一個同名的方法並不是對父類方法進行復寫(Override),而是重新生成一個新的方法,也就不存在多態的問題了。同理也可以解釋final,因爲方法同樣是不可覆蓋的。

2、方法是static修飾的

代碼如下所示.

class Base {
  public static void staticMethod() {
    System.out.println("Base staticMehtod");
  }
 
  public void dynamicMehtod() {
    System.out.println("Base dynamicMehtod");
  }
}
 
class Sub extends Base {
  public static void staticMethod() {
    System.out.println("Sub staticMehtod");
  }
 
  public void dynamicMehtod() {
    System.out.println("Sub dynamicMehtod");
  }
}
 
public class TJ4 {
  public static void main(String args[]) {
    Base c = new Sub();
    c.staticMethod();
    c.dynamicMehtod();
  }
}/* OutPut:
 Base staticMehtod
 Sub dynamicMehtod
 */

輸出結果並不像設想的那樣,輸出 "Sub staticMehtod"。因爲靜態方法是與類而不是與某個對象相關聯,c.staticMethod();等同於Car.staticMethod(); 所以儘量不要使用實例變量去調用靜態方法,避免混淆。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章