组合:(has-a)将一个对象的引用置于新的对象中。(这是我自己的解释,不是专业术语)
继承:(is-a)继承不是复制基类的接口,当你创建一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你直接创建对象是一样的。二者的区别在于,后者来自于外部,而基类的子对象被包装在导出类对象内部。
阅读上面俩应该已经可以看出一点了,组合是来自于外部,而继承过来的则包装在你的导出类内部。但还是有些模糊。
组合通常用于想在新类中使用现有类的功能。
在继承的时候使用现有类,并开发一个他的通用版本,通常你使用一个通用类(几何形)将其特殊话(三角形,正方形),也就是java多态的表现。
上面两句话简单来说就是(is-a)是一个的时候用继承,(has-a)有一个的时候用组合。
一个最清晰的判断是不是需要用到继承就是问下自己需不需要从新类向基类进行向上转型,如果必须要向上转型,则继承是必须的,如果不需要,则自己需要好好考虑下
继承和组合都能从现有类型生成一个新的类型。组合一般是将现有类型作为新类型底层实现的一部分加以复用,而继承复用的是接口。能用组合就尽量不要用继承,组合更加灵活点。
我的简单理解,欢迎各位大牛评论区纠正和补充