動態綁定機制使得基類的引用能夠指向正確的子類對象,從而使得面向基類編程成為可能。
然而動態綁定在以下兩種情況會失效。
1、基類方法是private或final修飾的
這個很好理解,因為private說明該方法對子類是不可見的,子類再寫一個同名的方法并不是對父類方法進行復寫(Override),而是重新生成一個新的方法,也就不存在多態的問題了。同理也可以解釋final,因為方法同樣是不可覆蓋的。
2、方法是static修飾的
代碼如下所示.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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(); 所以盡量不要使用實例變量去調用靜態方法,避免混淆。
以上這篇Java靜態方法不具有多態性詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。