2010-11-09 62 views
2

我有3個類,MainClass和main方法,一個名爲AbstractClass的抽象類和Subclass,它將被AbstractClass擴展。java對象和繼承數組

對象數組是在包含1個成員的類AbstractClass的main方法中創建的。 然後,我將數組的1個元素初始化爲類型Subclass(這可以嗎?)。 問題是我無法到達創建的對象(數組[0])的getDataToExport()方法。 我懷疑問題發生,因爲該數組是AbstractClass類型... 而問題:這甚至有可能完成? 我想要做的是使用一個AbstractClass類型的數組,並填充由不同的子類(在這段代碼中只是一個 - >子類)擴展AbstractClass的對象,但我不能得到該子類的方法。

主類主用方法

public class MainClass { 

    public static void main() { 

     AbstractClass array[]=new AbstractClass[1]; 
     array[0]= new Subclass(); // is this even allowed? 
     System.out.println(array[0].getDataToExport()); // Problem! 

    } 

} 

抽象類

public abstract class AbstractClass { 

} 

子類,其延伸抽象類

public class Subclass extends AbstractClass { 

    private int dataToExport; 

    public Subclass(){ 
     this.dataToExport=2; 
    } 

    public int getDataToExport() { 
     return dataToExport; 
    } 

} 

回答

2

,必須聲明getDataToExport()作爲抽象類的抽象方法。

4
AbstractClass array[]=new AbstractClass[1]; 
array[0]= new Subclass(); // is this even allowed?

是的,這很好,但它意味着,當你以後去使用它,你只能訪問什麼在AbstractClass(使用強制禁止規定,但要避免使用強制轉換無論你在哪裏,這裏都不需要一個)。

如果您只想與該類中定義的成員進行交互,那麼使AbstractClass類型的數組條目唯一真正的原因是。因此,舉例來說,在這種情況下,你可能想在抽象類定義爲抽象方法getDataToExport

public abstract class AbstractClass { 
    public abstract int getDataToExport(); 
} 

您也可以考慮尋找具有接口而不是一個抽象類。由於一個類只能從一個基類派生,但可以實現儘可能多的接口,除非有大量的常用實現放在抽象基類中,否則最好使用接口  —,因爲它不會對該接口的實現施加不必要的約束。事實上,通過界面你幾乎總是會變得更好;你可以隨時有一個抽象的基礎,如果你想。

因此,例如:

public class MainClass { 

    public static void main() { 

     NiftyThingy array[]=new NiftyThingy[1]; 
     array[0]= new NiftyThingyImplementation(); 
     System.out.println(array[0].getDataToExport()); 

    } 

} 

其中

public interface NiftyThingy { 

    public int getDataToExport(); 

} 

public class NiftyThingyImplementation implements NiftyThingy { 

    public int getDataToExport() { 
     return /* ... the data ... */; 
    } 

} 
+0

謝謝,這真的幫了我很多 – Luka 2010-11-09 21:12:25

+0

@Luka:很酷,很高興幫助。如果您覺得它回答了這個問題,您需要點擊答案開頭左側的空白複選標記,以便您將問題標記爲「已回答」。 (如果你*不認爲這回答了這個問題,那麼不要那樣做。:-)) – 2010-11-09 22:18:05

0

你將無法得到它,因爲你是抽象類聲明的數組爲了看到他們你有兩種選擇

  • 聲明您將在抽象類上使用的常用方法,並將它們聲明爲抽象類。覆蓋子類中的這些方法。例如:

    public abstract class AbstractClass public abstract int getDataToExport(); }

而且每個子類都必須重寫該方法或應聲明爲抽象。

  • 創建Sublclass的數組:

    子類陣列[] =新Sublcass [1]; array [0] = new Subclass(); System.out.println(array [0] .getDataToExport());

0

是的,這一切都很完美。您唯一遺漏的一步是您需要轉換爲具有所需方法的類型的對象實例。通常的做法是:

AbstractClass ac = array[0]; 
if (ac instanceof Subclass) { 
    System.out.println(((Subclass)ac).getDataToExport()); // No problem! 
} 

但是,您可能需要考慮以另一種方式進行操作。例如,在返回null的抽象類中實現getDataToExport的默認版本。這樣你就不必進行演員或實例測試。

0
AbstractClass array[]=new AbstractClass[1]; 
    array[0]= new Subclass(); // is this even allowed? 

事實上,作爲​​是AbstractClass的派生類。之所以

System.out.println(array[0].getDataToExport()); 

失敗是因爲編譯器找不到AbstractClass.getDataToExport()方法。只有​​有方法而不是其父。

有兩種方法來解決這個問題:

添加一個抽象方法getDataToExportAbstractClass像這樣:

public abstract class AbstractClass { 
    public abstract int getDataToExport(); 
} 

OR,類型轉換您的變量及其衍生(混凝土)類有getDataToExport()方法,如下所示:

if (array[0] instanceof SubClass) { 
    System.out.println(((SubClass)array[0]).getDataToExport()); 
} 

instanceof運算符只是聲明屬性是X類的(其中X是​​)。