2013-08-24 80 views
0

我是Java的新手,我理解繼承的基本基本概念。我有一個關於通過超類引用的問題。由於從超類繼承的或使用接口實現的類的方法可以通過超類引用(接口或類)引用。當擴展和實現都涉及到一個類時,它將如何工作?通過超級類/接口引用引用 - Java

class A { 
    void test() { 
    System.out.println("One"); 
    } 
} 

interface J { 
    void first(); 
} 

// This class object can referenced using A like A a = new B() 
class B extends A { 
    // code  
} 

// This class object can referenced using J like J j = new B() 
class B implements J { 
    // code 
} 

// my question is what happens in case of below which referencing for runtime polymorphism? 
class B extends A implements J { 
    // code 
} 

哪個失敗,編譯:

 
Main.java:16: error: duplicate class: B 
class B implements J { 
^ 
Main.java:21: error: duplicate class: B 
class B extends A implements J { 
^ 
2 errors 
+0

你能舉個例子說明你的意思? – arshajii

+0

目前還不清楚你在問什麼。一個例子? –

+0

請檢查鏈接。 。 http://ideone.com/7xRRdR – user2713902

回答

0

當引用超類方法和接口方法時可能會有一些差異,特別是當您使用super來調用它們時。考慮到這些接口/類:

public interface MyIFace { 
    void ifaceMethod1(); 
} 


public class MyParentClass { 
    void parentClassMethod1(); 
} 

public class MyClass extends MyParentClass implements MyIFace { 

    public void someChildMethod() { 
     ifaceMethods(); // call the interface method 
     parentClassMethod1(); // call the parent method just like you would another method. If you override it in here, this will call the overridden method 
     super.parentClassMethod1(); // you can use for a parent class method. this will call the parent's version even if you override it in here 
    } 

    @Override 
    public void ifaceMethod1() { 
     // implementation 
    } 

} 

public class AnExternalClass { 
    MyParentClass c = new MyClass(); 
    c.parentClassMethod1(); // if MyClass overrides parentClassMethod1, this will call the MyClass version of the method since it uses the runtime type, not the static compile time type 
} 

在一般情況下,調用該方法不super將調用類的運行時版本中實現的方法(不管方法是否是從一個類或接口)

+0

如果我說MyIFace mif = new Myclass(),它會如何工作? – user2713902

+0

將調用Myclass版本。只有運行時類型用於多態呼叫。 –

0

當兩個延伸,農具都參與了一類將如何運作?

假設這是你的問題。

延伸關鍵字是擴展超類。

工具是實現接口


接口和超類之間的差別是,在一個接口,你不能指定具體執行整個的(只有它的「接口」 - 接口無法實例化,而是實現了)。因此,這意味着您只能指定要合併的方法,但不能在同一意義上在項目中實現它們。