class B extends A
通过这段代码,B类可以使用A类的变量和方法。
class B
{
A a=new A();
}
现在我们也可以通过类 B 中的对象 a 来使用类 A 的变量和方法。
所以我的问题是----为什么我们使用这两种不同的方式来使用其他类属性(就变量和方法而言)..
最佳答案
第二种方法称为“委托(delegate)”。还有组合 - 当A
是B
的成员时。
两者之间的区别在于,如果A
与B
不在同一个包中(包访问是不同的情况 - 留给读者练习) -那么在委托(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/