Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java编写组合和聚合_Java_C++_Oop - Fatal编程技术网

如何用java编写组合和聚合

如何用java编写组合和聚合,java,c++,oop,Java,C++,Oop,我想知道如何在java中识别组合和聚合代码。我有C++代码,但我不懂如何用java编写。p> 构图 class A {}; class B { A composited_A; }; 通过指针聚合 class A {}; class B { A* pointer_to_A; B(A anA){ pointer_to_A = &anA; } 谁能告诉我这两种语言是如何在JAVA中工作的。(我知道合成和聚合是什么意思) }; 在Java中,对象仅由指针引用。这意味着a类型的字段实际上是对

我想知道如何在java中识别组合和聚合代码。我有C++代码,但我不懂如何用java编写。p> 构图

class A {};
class B { A composited_A; };
通过指针聚合

class A {};
class B
{
A* pointer_to_A;
B(A anA){ 
pointer_to_A = &anA;
}
谁能告诉我这两种语言是如何在JAVA中工作的。(我知道合成和聚合是什么意思)
};

在Java中,对象仅由指针引用。这意味着
a
类型的字段实际上是对
a
对象的引用。这还意味着该字段将始终以空指针开始,并且必须显式地将其分配给
newa()
或其他任何对象

编辑:

class B {
   A a;

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

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

Java本身根本不区分组合和聚合。您不能在Java类型系统中表达引用的所有权概念——如果您明确需要表达所有权,则必须使用其他方法(通常只需构造一个新对象存储在类实例中)来表示所有权


因为Java有一个GC,所以根本不需要表示内存的所有权;内存由GC单独拥有和管理。当然,其他资源的情况并非如此,在这里您可能仍然希望表示所有权。

我认为这是用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;  
    }  

    //...  
}  
聚合

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;  
    }  

    //...  
}  

谢谢。这是聚合吗?这取决于您如何使用
a
。通常,如果意图是合成,则将
a
设为
final
,以便它永远不会更改,然后确保在构造函数中为其分配非空值。如果目的是聚合,您可以提供一个
setA()
方法来更改
a
。再次感谢。现在清楚了。这个链接也是一个例子。我想知道它在哪里是正确的。[link]使引用指针指向字段
a
final
不会将聚合缩小到合成。当
B
的封闭实例死亡时,对象仍然没有死亡。它用
A
来定义它,只有当
A
仅作为
B
的一部分存在时,它才是组合。我认为,如果<代码> <代码>是<代码> b>代码>的永久和必要部分,即使<<代码> < <代码>也可以单独存在,或者作为另一个类的一部分,我认为它是构图。我不确定哪个是对的。