2017-05-31 56 views
-2

我有一個接口和三個類。在類B中,我定義了一個名爲printHello的方法。然後,在類Test中,我聲明新對象並將其分配給一個新的B.爲什麼我不能使用接口中未定義的方法?

問題是,代碼不能編譯,因爲我得到一個錯誤,指出「方法printHello()未定義類型IHello」。這讓我感到困惑,因爲我能夠將一個IHello類型的對象分配給一個新的B,所以即使該接口沒有它們,該對象也不能使用B的方法嗎?

爲了解決這個問題,我知道我可以在IHello接口中聲明一個名爲printHello的方法,或者我可以聲明類型B的對象。我還能做些什麼來解決這個問題嗎?

接口IHello

public interface IHello { 

    void hello(); 

} 

A類

public class A implements IHello{ 

    public void hello(){ 
     System.out.println("hello"); 
    } 
} 

B類

public class B extends A { 

     public void printHello(){ 
      this.hello(); 
     } 
} 

類檢驗

public class Test { 

    public static IHello b; 

    public static void main(String[] args) { 

     b = new B(); 
     b.printHello(); //The method printHello() is undefined for type IHello 
    } 
} 
+3

***變量***(不是*對象*)的*類型*是什麼?這是編譯器所看到的。順便提一下,這裏已經提到了數十億次。 –

+0

變量的類型是IHello,但是因爲它被分配到一個'B',我想了解爲什麼我不能使用'B'的方法。 –

+3

編譯器沒有查看實際的對象類型。它正在看你宣佈的類型 - IHello。在某些情況下,編譯器可能不知道實際的對象類型,因爲它可能僅在運行時纔可用。 –

回答

2

B類擴展一個類,不關你的A類或B與接口IHello關係,因此你不能實例B和它分配給b因爲b類型是IHello

如果A類是一個實現接口IHello,你應該讓作爲

public class A implements IHello{ 
    ... 
} 

請注意,如果您聲明實例變量x類型XXX,只有在課堂XXX方法是實例x可見。在你的情況下,你聲明b爲IHello,只有方法hello()可以被實例b訪問,它不能訪問printHello(),只有聲明爲B的實例可以調用printHello(),如果你100%肯定b是B的一個實例,你可以將實例b轉換爲類型B.

+0

感謝您的回答,但即使這一變化,我仍然得到同樣的錯誤。 –

+0

@OmarN見我最後一句話 – haifzhan

相關問題