理解的麻烦扩展和实例化.扩展与实例化类相同



我的问题是。这些是一样的吗?

public class Pet {
}

public class Fish extends Pet {
}

如果我将课堂宠物扩展到我的鱼类课程,那与我在鱼类课上实例化的宠物课程一样吗?扩展位于上方,实例化在下面。它们是一样的吗?

public class Pet {
}

public class Fish {
Pet myPet = new Pet ();
}

第一个示例描述了继承,第二个 - 组成。这些是两个OOP概念。它们允许程序员重复使用常见逻辑。您应该更喜欢在继承上使用Composiiton。

复制其他答案:

它们绝对不同。继承是" is-a"关系。构图是" has-a"。

您通过将另一类C作为字段的实例进行组成您的班级,而不是扩展C。一个很好的例子组成比继承要好得多Java.util.stack,目前扩展了Java.util.Vector。现在是被认为是错误的。堆栈"不是A"向量;你不应该允许任意插入和删除元素。应该是代替构图。

不幸的是,纠正这个设计错误为时已晚,因为现在更改继承层次结构将破坏与现有代码。堆栈使用了构图而不是继承,总是可以修改以使用其他数据结构而不违反API。

我强烈推荐乔什·布洛赫(Josh Bloch)的书有效Java 2nd Edition

项目16:偏爱继承

项目17:设计和文档的继承或禁止它

良好的面向对象设计并不是关于自由扩展现有类的内容。你的第一个本能应该是撰写。

它们不相同。

在第一个示例中,使用继承,Fish的实例可以访问其自己的所有属性和方法,包括通过Pet继承,通过thisself,取决于语言。

在第二个示例中,myPet只是一个恰好是Pet类的实例,但是PetFish彼此之间没有关系。

它们完全不同。扩展是" IS-A"关系,而后来(组成)为" has-a"。在这里查看更多详细信息。

不,它们完全不同。

在此public class Fish extends Pet { }中,您正在使用继承将宠物类扩展到鱼类类,这意味着鱼是宠物的子类,它将继承宠物类。

但是,在这个

 public class Fish {
 Pet myPet = new Pet (); }

您正在创建一个名为Fish的全新对象,该对象并非从任何东西延伸,只是它具有宠物的类级对象,因此您可以通过mypet对象使用宠物对象方法的方法,但是它不是鱼继承,因此鱼将是其自己的物体,而不是宠物的子类。

这些是差异。

至于应该使用的何时,以下是一般规则:如果您正在增强类班级中的一个变量。

最新更新