2013-07-13 78 views
0

我是新來的java,並且在嘗試一些what is the output問題時發現了這個問題。爲什麼這個接口實例在引用實現該接口的類實例時會出錯

這條線InterfaceB obj = new ClassA();給出錯誤,而其他不是。

我知道一個超類變量可以引用一個子類變量,它和接口相同。 但是在這種情況下會發生什麼。我想知道看到的背後發生了什麼。

interface InterfaceA { void methodA(); } 

interface InterfaceB extends InterfaceA { void methodB(); } 

class ClassA implements InterfaceA 
{ 
    public void methodA() {} 
    public void methodB() {} 
} 

class ClassB extends ClassA implements InterfaceB 
{ 
    public ClassB() {} 
    // InterfaceA obj = new ClassA(); no error 
    InterfaceB obj = new ClassA(); //give error: incompatible types 
    // InterfaceA obj = new ClassB(); no error 
    // InterfaceB obj = new ClassB(); no error 
     // ClassA obj = new ClassB(); no error 
} 

public class Online4 { 
    public static void main(String args[]) { 
     ClassB b = new ClassB(); 
    } 
} 

回答

3

因爲ClassA的未實現接口B.

永遠記住,在Java中的父類型可以引用子類型你得到這個錯誤。

類型IntefaceB與類型ClassA無關。以及下述工作

InterfaceB obj = new ClassA(); 

ClassA的需要具有它的父類是InterfaceB(直接或通過任何其它類型的,它實現InterfaceB(類)或延伸InterfaceB(接口)。

+0

我錯過了InterfaceA是Hierarchy中的父級,InteraceB和ClassA就像兄弟姐妹一樣。 – netsmertia

1

接口的引用可以保持參照對象,implenting該接口在你的情況你CLASSA沒有實現interfac乙因此你在得到的錯誤:。

InterfaceB obj = new ClassA(); 

在所有其他評論的情況下在你的代碼接口的參考使用的是實際的持有實現該接口的類(子/父)的對象。

1

一個接口包含一個類實現的行爲。

在你的情況ClassA沒有實現接口B.

InterfaceB obj = new ClassA(); //give error: incompatible types 

,使該行的工作,你可以用interfaceB

interface InterfaceA extends InterfaceB 

現在

InterfaceB obj = new ClassA(); //compiles 
延長你了InterfaceA

你正在做相反的事情。其中InterfaceBInterfaceA的父項。

1

爲了表述清楚地繼承鏈:

1)InterfaceB是接口A的子

2)A類是接口A

3)B類的一個孩子的孩子接口B和類A(以及接口A)

父變量(接口或類)類型可以包含子類(類)實例。 除此之外的任何內容都會引發錯誤。