java - 继承和组合之间的区别?

标签 java inheritance composition

class B extends A 

通过这段代码,B类可以使用A类的变量和方法。

class B
{
    A a=new A();
}

现在我们也可以通过类 B 中的对象 a 来使用类 A 的变量和方法。

所以我的问题是----为什么我们使用这两种不同的方式来使用其他类属性(就变量和方法而言)..

最佳答案

第二种方法称为“委托(delegate)”。还有组合 - 当AB 的成员时。

两者之间的区别在于,如果AB不在同一个包中(包访问是不同的情况 - 留给读者练习) -那么在委托(delegate)组合的情况下,您将只能访问A类的公共(public)数据成员和方法,而在情况下继承,继承类B将可以访问类A的公共(public)和 protected 成员和方法。

更新

即使在 A 的所有方法和成员都可供 B 访问的情况下,也存在很多其他差​​异(其中大多数与您不是这两个类的所有者,而是当 A 由第三方提供给您并且您无法控制其访问修饰符时)。

但是,即使您确实拥有控制权并且可以将 A 的所有成员和方法定义为 public - 您愿意吗?它将引入一系列额外的维护问题 - 最重要的是,IMO,您定义为 public任何都是您和代码用户(也许是某个人)之间的契约(Contract)在地球的不同部分。这反过来意味着您无法向他隐藏您的实现细节、您的私有(private)实用方法或任何内容 - 没有什么可以阻止他直接使用您仅为某些内部计算而编写的某些方法。

这意味着 - 当明天您决定不想再次维护该方法或者它引入某种性能或安全问题时 - 您无法删除它。 已经有人使用它了。

另一更新

正如下面提到的,以及我没有提到的,在继承的情况下,您还会收到一份“免费礼物” - 多态性。 <强> See here.

关于java - 继承和组合之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8046460/

相关文章:

java - 扩展一个包含对自身列表的引用的类

java - 同步线程行为

java - 使用 X 按钮关闭 jar 的命令提示符时如何捕获事件?

java - JVM 的 Eclipse 启动错误已终止。升级 Ubuntu 更新后退出代码=13

hibernate - jpa如何创建与父实体具有相同id的新实体(联合继承)

java - 在java中如何处理 super ?

c# - .NET 继承 : suppress a property from the base class

java - 语法错误: Encountered "BEGIN"

python - 管理(和重命名)类组合的实例变量

c++ - 关于何时调用嵌入对象的复制构造函数的困惑