2016-01-22 39 views
1
abstract class A { 

    int met(A a) { 
     return 0; 
    } 

    int met(B b) { 
     return 1; 
    } 

    int met(C c) { 
     return 2; 
    } 
} 

class B extends A { 

    int met(A a) { 
     return 3; 
    } 

    int met(B b) { 
     return 4; 
    } 

    int met(C c) { 
     return 5; 
    } 
} 

class C extends B { 
    int f() { 
     return ((A)this).met((A)this); 
    } 
} 

public class teste { 
    public static void main(String args[]) { 
     C x = new C(); 
     System.out.println(x.f()); 
    } 
} 

該程序將返回3,我期待0.爲什麼方法f中的第一個鑄造什麼都不做,第二個工作?是否因爲在A和B類中met方法被重載並因此使用靜態綁定?Java投給超類和呼叫超載方法

回答

1

這就是多態性的工作方式。只要考慮這個例子:

A a = new C(); 
a.met(a); 

這將按預期調用正確的方法B#met(...)。由於Object與其方法之間的綁定強於存儲類型和與之相關的方法之間的綁定,所以對象的方法表不會因爲您更改存儲在Object中的變量的類型而發生更改它。第二種類型工作,因爲輸入的類型被鑄造爲A,因此該方法將其識別爲A(輸入存儲的類型比Object類型具有更強的綁定)。