Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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_Oop_Object_Composition - Fatal编程技术网

Java 构图中的对象?

Java 构图中的对象?,java,oop,object,composition,Java,Oop,Object,Composition,作为初学者,我一直在学习构图和继承。我意识到,当使用合成时,你不创建对象,而是创建合成。我在这里有点困惑。假设我们正在建造一个有头、两条胳膊和两条腿的人 通常,我要做的是创建arms、legs和head类,然后创建由这些类构建的对象human。但是在组合中,您构建了一个与其他类链接的人类类?我错在哪里 组成: class Human { Head head; Arm leftArm, rightArm; Leg leftLeg, rightLeg; } 如果在另一个类中使用对象(如

作为初学者,我一直在学习构图和继承。我意识到,当使用合成时,你不创建对象,而是创建合成。我在这里有点困惑。假设我们正在建造一个有头、两条胳膊和两条腿的人

通常,我要做的是创建arms、legs和head类,然后创建由这些类构建的对象human。但是在组合中,您构建了一个与其他类链接的人类类?我错在哪里

组成:

class Human {
  Head head;
  Arm leftArm, rightArm;
  Leg leftLeg, rightLeg;
}
如果在另一个类中使用对象(如头部),则可以创建合成

继承:

class Woman extends Human {
}

组合例子:考虑一个汽车和一个非常具体的发动机的例子(这意味着它不能用于任何其他的汽车)。汽车和特定发动机等级之间的这种关系称为组合。没有特定引擎类的对象,Car类的对象就不能存在,没有Car类,SpecificEngine的对象就没有意义。简单地说,汽车类仅“拥有”特定的发动机类

聚合示例:现在考虑类车和类轮。汽车需要一个轮子来运转。意思是汽车对象拥有车轮对象,但我们不能说车轮对象没有汽车对象就没有意义。它可以很好地用于自行车、卡车或不同的汽车对象。

当Neo(来自Matrix)通过将其下载到大脑中学习功夫时,它被称为合成(你给一个对象一个协议来遵守,或“连接”不同的其他对象)。但是Neo不会有Trinity的眼睛颜色,因为他们没有关联(这只可能在矩阵中,而不可能在现实生活中)


如果Neo和Trinity有了孩子,她就不会知道功夫(除非后来她被明确介绍到与Neo相同的下载),但仍然会有Trinity的眼睛。那是继承。

的确,你错了

组合通常被视为继承的替代方案,但在这两种情况下,您都可以操纵类的实例,而不仅仅是您为组合情况所设想的类。

以你为例,继承性的一个非常糟糕的例子是:

  • 两条腿的
    twoolegs
  • 一个
    TwoArms和TwoLegs
    类(TwoLegs的子类),既有两只手臂,也有两只腿
  • 一个
    headandtwoarmsandtowlegs
    类(
    twoarmsandtowlegs
    的子类),它既是一个头部,又是两个手臂和两条腿
  • 一个
    人类
    类(头和两条胳膊和两条腿的子类),它既是人类,也是所有的遗骸
它不灵活,因为所有类在其层次结构及其结构定义本身中都有很强的相关性。

在这里,组合将有一个拥有5个字段的Human类:

  • Leg类的
    rightLeg
    字段
  • Leg类的
    leftLeg
    字段
  • Arm类的
    leftArm
    字段
  • Arm类的
    rightArm
    字段
  • head类的
    head
    字段

is-a关系是一种继承,has-a关系是一种组合

类管理器扩展雇员{ }//这称为继承,因为所有经理都是员工

类管理器扩展雇员{ 团队=新团队()

}


在这里,经理有一个团队来管理,所以这属于组合。(has-a关系)

组合:由于发动机是汽车的一部分,它们之间的关系就是组合。下面是如何在Java类之间实现它们

public class Car {
    //final will make sure engine is initialized
    private final Engine engine;  

    public Car(){
       engine  = new Engine();
    }
}

class Engine {
    private String type;
}
聚合:由于组织将人员作为员工,因此他们之间的关系是聚合。以下是它们在Java类方面的外观

public class Organization {
    private List employees;
}

public class Person {
    private String name;   
}

当然,您可以在合成中创建对象。你最初的前提是错误的。继承表达IS-A关系;composition表示HAS-A。你是说复合设计模式吗?在composition中,你的外部对象是由更小的内部对象组成的。我说的是@wdcYes,但它们是否定义为文字对象@最后一点是的,但我不是在问它们之间的区别。我试图理解对象和构图之间的关系。这个例子很好地展示了构图的工作原理-有(或应该有…)一个
头的实例,两个
臂的实例和
腿的实例。。。假设通过
head=new head()
(etc)正确实例化了这些对象,那么您对此有什么不明白的?请将其添加到以前的答案中。不要将其作为单独的答案添加。