2012-03-25 75 views
5

我想知道如何在java中識別組合和聚合代碼。我有C++代碼,但我不明白如何在Java中編寫代碼。如何在java中編寫組合和聚合

聚集通過指針

class A {}; 
class B { A composited_A; }; 

組成

class A {}; 
class B 
{ 
A* pointer_to_A; 
B(A anA){ 
pointer_to_A = &anA; 
} 

誰能告訴我如何都在Java工作。 (我知道什麼是組成和聚合的意思) };

回答

8

Java本身根本就沒有組成和聚合之間的區別。您不能在Java類型系統中表達引用的所有權概念 - 如果您明確需要表示所有權,則必須使用其他方法(通常簡單地通過構造將存儲在類實例中的新對象)來表示這一點。

由於Java具有GC,所以內存所有權根本不需要表示;內存僅由GC擁有和管理。當然,對於其他資源也是如此,在這裏您可能仍然想要表達所有權。

1

在Java中,對象只能被指針引用。這意味着A類型的字段實際上是對A對象的引用。這也意味着該字段將始終以空指針開始,並且您必須將其明確指定給new A()或其他任何內容。

編輯:

class B { 
    A a; 

    B(A a) { 
     this.a = a; 
    } 

    B() { 
     this(new A()); 
    } 
} 
+0

謝謝。但是你能否在java代碼中提供一個例子。 – Mifas 2012-03-25 17:31:31

+0

謝謝。這是聚合嗎? – Mifas 2012-03-25 17:37:13

+0

這取決於你如何使用'a'。通常情況下,如果意圖是組合,你可以使'a'成爲'final',這樣它就永遠不會改變,然後確保它在構造函數中被分配了一個非空值。如果意圖是聚合,你可以提供一個'setA()'方法來改變'a'。 – 2012-03-25 17:40:36

-1

我認爲這是用Java代碼表示組合和聚合的最佳方式。

組成

public class Person 
{ 
    private final Name name; 

    public Person (String fName, String lName) 
    { 
     name = new Name(fName, lName); 
    } 

    //... 
} 

聚集

public class Person 
{ 
    private Costume currentClothes; 

    public void setClothes(Costume clothes) 
    { 
     currentClothes = clothes; 
    } 

    //... 
} 

Source