2014-01-26 40 views
-2

我是java的新手,並且正在嘗試理解面向對象的編程。Java,將對象傳遞給不同的類

我想存儲一個對象在數組中。但是,該數組與原始對象位於不同的類中。我得到一個編譯器錯誤(不兼容類型)需要(1類)找到(另一類)。

請看看我的代碼,讓我知道我做錯了什麼。

這是來自「集羣」類,並且此方法應該將類「FeatureVector」中的對象存儲到名爲「featureV」的數組中。

public boolean add (FeatureVector examples){ 
    int currentPosition; 

    if (this.getSize()==this.featureV.length){ 
     return false; 
    } 
    else 
     currentPosition=this.getSize(); 
    featureV[currentPosition+1]=examples; 
    return true; 

編輯:

這是羣集的方式被定義爲以及featureV:

class Cluster{ 
    private Cluster [] featureV; 


Cluster(int capacity){ 
    Cluster [] featureV= new Cluster [capacity]; 

錯誤:

錯誤:不兼容的類型 需要:羣集 實測值:FeatureVector

如果它幫助,這裏是要求,這是我首先實現了輸出:

Cluster c; 
c = new Cluster(10); 
c.add(new FeatureVector("A", new double[] { 0.0, 0.0 })); 
c.add(new FeatureVector("B", new double[] { 1.0, 1.0 })); 
c.add(new FeatureVector("C", new double[] { 1.0, 0.0 })); 
c.add(new FeatureVector("D", new double[] { 2.0, 0.0 })); 
FeatureVector.setVerbose(true); 
System.out.println(c); 

以上語句將在控制檯上顯示如下:

Cluster: {A: {0.0, 0.0}, B: {1.0, 1.0}, C: {1.0, 0.0}, D: {2.0, 0.0}} 

如果需要了解更多信息,請讓我知道。

非常感謝!這個論壇是一個啓示。 :)

+0

如何聲明'featureV'? – zmbq

+2

請發佈確切的錯誤,並指出此錯誤引用的源代碼中的位置。還顯示如何聲明類型,例如什麼是'featureV'? – nos

+0

想一想你的對象模型。 Cluster對象包含一個Cluster對象數組沒有多大意義。什麼是集羣?* – EJP

回答

0

在附加(FeatureVector示例)您存儲類FeatureVector陣列中featureV

public boolean add (FeatureVector examples){ 
    [...] 
    featureV[currentPosition+1]=examples; 
    [...] 
} 

對於這個工作featureV將必須是類FeatureVector []或FeatureVector類的超類[的對象]。

但在宣佈在你的第二個片段變量featureV時,你聲明爲集羣[]

class Cluster{ 
    private Cluster [] featureV; 

除非FeatureVector擴展羣集(這可能會在這方面沒有任何意義)featureV是錯誤的類型以適應FeatureVector。 您需要更改featureV的類型FeatureVector []

class Cluster{ 
    private FeatureVector [] featureV; 

說明一下,簡單一點,讓更改類的類型和變量名到別的東西:

class FruitBasket { 
    private FruitBasket [] fruits; 

    public boolean add (Fruit examples){ 
    fruits[currentPosition+1]=examples; 
    } 
} 

所以現在我們有一個類FruitBasket,其中FruitBasket類的每個對象都包含一個FruitBaskets數組。所以我們有一定數量的FruitBaskets可以安裝的插槽。 現在,在您的添加方法中,您可以拿水果並嘗試將它們擠入FruitBasket插槽。 你能看出爲什麼這不起作用嗎? 只能將兼容對象從一個轉換爲另一個。所以雖然你可以使用蘋果或橙子,當它說水果時,你不能使用水果,當它說FruitBaskets。

所以你做的是這樣的:

class FruitBasket { 
    private Fruit [] fruits; 

    public boolean add (Fruit examples){ 
    fruits[currentPosition+1]=examples; 
    } 
} 

這可能是您的本意。這個FruitBasket現在有一定數量的水果插槽,現在你可以使用add()方法向籃子中添加另一個水果。

+0

非常感謝您的回覆。這非常有幫助。我只是有一個問題。如果我在Fruit類下聲明一個數組水果,爲什麼我需要FruitBasket類?階級的想法是保護信息,並使其隱私。如果我按照上面提供的示例進行操作,我的水果是否屬於FruitBasket或Fruit在數據保護方面?該行「私人水果[]水果」;「在FruitBasket中還是在Fruit中保密? 再次感謝您。你一直非常有幫助。 – JavaThings

+0

數據保護不是類中最重要的部分。課程更多的是將所有屬於一起的東西裝在一起。 舉個例子:它是否有意義,一個水果是由多個水果組成的?如果是這樣,請繼續,如果不是,請將Fruit-Array包裝到不同的課程中,該課程包含/包含水果。 對於第二個問題:你必須區分對象和引用。對象是內存中數據的某種表示。引用是指向該對象的變量。 參考水果只有FruitBasket可見,對象對所有人都可見 – Dakkaron

+0

所以如果你給兩個不同的對象引用同一個水果,那麼兩者都可以訪問水果。 例如: 水果蘋果=新水果(); FruitBasket basketA = new FruitBasket(); FruitBasket basketB = new FruitBasket(); basketA.add(apple); basketB.add(apple); 現在,蘋果將在這兩個籃子的水果陣列中。兩個籃子都能夠訪問蘋果。 但是參考私人水果[]水果將無法從其他類訪問(從外部FruitBasket.fruits [0] =蘋果;將無法使用) – Dakkaron

0

嘗試

class Cluster{ 
    private FeatureVector [] featureV; 


Cluster(int capacity){ 
    FeatureVector [] featureV= new FeatureVector [capacity]; 

你要定義一個特定類型(此處集羣)的對象的數組,你想存儲這個陣列中的另一個對象;這不相容。您必須定義要存儲對象的類的數組。

+0

上面的例子可能會工作,但它新的對象是在FeatureVector下定義的,而我需要它們在Cluster下。由於在我原來的代碼中,我試圖在Cluster中存儲FeatureVector的引用,所以沒有任何意義。但是,如果我有一種方法,從FeatureVector正確複製對象的數據並在Cluster下創建一個全新的對象,它可能會起作用,但我不知道如何做,或者甚至可能。 – JavaThings

+2

上面的例子看起來是正確的。你的評論是不可理解的。 – EJP

+0

考慮重構你的類,可能你應該讓自己熟悉對象的繼承和反射。 –