動態綁定機制使得基類的引用能夠指向正確的子類對象,從而使得面向基類編程成為可能。
然而動態綁定在以下兩種情況會失效。
這個很好理解,因為private說明該方法對子類是不可見的,子類再寫一個同名的方法並不是對父類方法進行復寫(Override),而是重新生成一個新的方法,也就不存在多態的問題了。同理也可以解釋final,因為方法同樣是不可覆蓋的。
代碼如下所示.
1 class Base { 2 public static void staticMethod() { 3 System.out.println("Base staticMehtod"); 4 } 5 6 public void dynamicMehtod() { 7 System.out.println("Base dynamicMehtod"); 8 } 9 } 10 11 class Sub extends Base { 12 public static void staticMethod() { 13 System.out.println("Sub staticMehtod"); 14 } 15 16 public void dynamicMehtod() { 17 System.out.println("Sub dynamicMehtod"); 18 } 19 } 20 21 public class TJ4 { 22 public static void main(String args[]) { 23 Base c = new Sub(); 24 c.staticMethod(); 25 c.dynamicMehtod(); 26 } 27 }/* OutPut: 28 Base staticMehtod 29 Sub dynamicMehtod 30 */
輸出結果並不像設想的那樣,輸出 "Sub staticMehtod"。因為靜態方法是與類而不是與某個對象相關聯,c.staticMethod();等同於Car.staticMethod();所以盡量不要使用實例變量去調用靜態方法,避免混淆。