2012-11-12 65 views
4

請在下面的代碼片段中解釋這個問題。是對象層次結構的接口部分嗎?

public class Test { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    I ref = new B(); 
    ref.equals(""); 
} 

} 

interface I{ 

} 

class A { 
public void method(){ 

} 
} 

class B extends A implements I{ 

} 

請參考main()ref.equals()是允許的,但ref.method()是不允許的。爲什麼如此?對象是B(或A或任何其他類)的超類,但以同樣的方式A也是B的超類。我的問題是爲什麼A的'method()'不是在'ref'中可見,即爲什麼ref.equals()是允許的,但ref.method()不是?這種方法的可見性檢查如何完成?它是否植根於JVM?

回答

7

那是因爲你沒有宣佈它作爲我:

I ref = new B(); 

你只能看到我and the methods from Object聲明的方法。

當你這樣做:

聲明爲:

A ref = new B(); 

或聲明其爲B

B ref = new B(); 

,或者轉換爲

I ref = new B(); 
((A)ref).method() 

你會有權訪問:

ref.method() 

如果您希望看到來自A和我的方法,您可以在它們之間施放對象,那麼要完整。或者也有我的工具。

1

當您使用其接口引用對象時,例如

 I ref = new B(); 

那麼你的接口和Object類的方法只有無障礙。在您將該對象轉換爲其類之前,您沒有任何類方法的可見性

如果您要訪問A類中聲明的method,那麼你可以做下面的一個:

I ref = new B(); 
    ((A)ref).method() 

A ref = new B(); 
    ref.method(); 

B ref = new B(); 
    ref.method(); 
0

接口類型只能使用默認爲子類的具體類來實例化對象的ss。因此你可以調用一個接口類型的Object中的方法。所有其他自定義方法只有在該接口或其超級接口中聲明時纔可以在接口類型上調用。

0

如果通過接口引用對象,則只能訪問接口公開的方法。

0

ref.equals()是允許的,因爲equals()是從對象開始的方法,可用於所有子類(即使B因爲B隱含地延伸了Object)。

如果method()不在B中,那麼在語句爲I i = new B()時無法訪問它。