我的问题是。这些是一样的吗?
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
继承,通过this
或self
,取决于语言。
在第二个示例中,myPet
只是一个恰好是Pet
类的实例,但是Pet
和Fish
彼此之间没有关系。
它们完全不同。扩展是" IS-A"关系,而后来(组成)为" has-a"。在这里查看更多详细信息。
不,它们完全不同。
在此public class Fish extends Pet { }
中,您正在使用继承将宠物类扩展到鱼类类,这意味着鱼是宠物的子类,它将继承宠物类。
但是,在这个
中 public class Fish {
Pet myPet = new Pet (); }
您正在创建一个名为Fish的全新对象,该对象并非从任何东西延伸,只是它具有宠物的类级对象,因此您可以通过mypet对象使用宠物对象方法的方法,但是它不是鱼继承,因此鱼将是其自己的物体,而不是宠物的子类。
这些是差异。
至于应该使用的何时,以下是一般规则:如果您正在增强类班级中的一个变量。