2017-01-10 46 views
0

我想解決一個Java中看起來很奇怪的方法調用問題,我希望有人可以幫忙。 這三個類的代碼,A是一個用C從A繼承和d從C.在類層次結構中的方法調用練習

class A { 
    int f(double x) { 
     return 1; 
    } 

    int f(boolean x) { 
     return 2; 
    } 
} 

class C extends A { 
    int f(double x) { 
     return 3; 
    } 

    int f(int x) { 
     return 4; 
    } 
} 

class D extends C { 
    int f(double x) { 
     return 5; 
    } 

    int f(int x) { 
     return 6; 
    } 

} 

public class test { 
    public static void main(String[] args) { 
     C b = new D(); 
     A d = new D(); 

     System.out.println(b.f(33)); 
     System.out.println(d.f(33)); 
    } 
} 

繼承當我打電話對象的方法b相的int我得到6,這意味着頂部類來自類D的方法f(int x)被調用。但是當我在對象d上調用同樣的方法時,我得到5,這意味着調用類D的方法f(double x)。爲什麼它的行爲如此?爲什麼整數在一種情況下被認爲是一個整數,在另一種情況下則被認爲是一個整數?這與我如何宣佈這兩個對象有關,但我無法得到它。

回答

1

區別在於對象的類型。 b的參考類型爲Cd的參考類型爲A。在繼承的情況下,JVM在運行時綁定方法,這意味着您只能調用引用類型的方法,但重寫的方法是可以運行的方法。

當你調用上d功能,JVM自動轉換到double因爲A有一個int參數沒有相應的方法。然後,由於該對象是D的一個實例,該方法會慢慢下降到D,但它仍然會以double的速度緩慢下降。

相關問題