让我们了解所有关于继承的知识
嗨,大家好! 今天我们可以讨论我们在 Java 中的 OOP 中的一个概念。 其实这也是我面试的时候问的。 所以,我决定写我已经知道的东西。 但是除了解释继承之外,还有更多的事实!! 更多的焦点将放在钻石问题上,以及解决它的替代方法是什么……
什么是继承?
继承是两个类之间的关系/关联,其中一个类继承另一个类的属性。 这种关系是使用 Java 中的 extends 关键字定义的,如下所示。
public class X extends Y {}
这是 IS-A 关系。 让我们举个例子。 我们可以将 Vehicle 和 Car 定义为两个相关的类,其中 Vehicle 是父类,Car 是子类。 在这里,汽车就是汽车!!! 不是吗?
我不会深入解释继承。 但是我们可以简要讨论一下我们拥有的继承类型。
public class X {}public class X extends Y {}
public class X {}public class Y extends X {}public class Z extends Y {}
public class X {}public class Y extends X {}public class Z extends X {}
多重继承
这是文章的重点!!! 这里 1 个类扩展了 1 个以上的类。
public class X {}public class Y {}public class Z extends X, Y {}
坚持,稍等! Java支持吗?不! Java中不允许多重继承!在任何给定的时间点,给定的 Java 类只能从一个超类扩展。
为什么?让我们来看看…
钻石问题
它发生在这种情况下。假设我们有一个名为 A 的抽象父类。然后我们有扩展 A 的 X 和 Y 类。对吗?然后我们有另一个类 Z 扩展了 X 和 Y(棘手的部分)!所有的类都有一个名为 methodX 的方法,它继承自 A。X 和 Y 都重写了方法实现以提供自己的逻辑。
那么,如何在 Z 类中覆盖 methodX ???
我们不可以。它造成了歧义,因为我们有 2 个具有相同方法的父类。那么,要覆盖哪一个? Java 编译器本身就很混乱!这就是Java不支持多重继承的原因。在那里,我们遇到了钻石问题!
那么,为什么它被称为钻石问题呢?
让我给你看一个UML图。看看班级安排……那你就明白了!
你答对了? 菱形类设置是这个名字的原因!
替代解决方案
我们有类似的带有接口的替代实现。 我们可以实现一个具有任意数量接口的类。 Java 已经支持它。
但是如果两个接口也有相同的方法会发生什么呢?
看下面的例子……这包括 Java 8 默认方法
我们有 2 个具有相同默认方法的接口。 那么 Z 是继承的派生类 现在它在 methodX() 方法中遇到了歧义。
interface X { default void methodX() { System.out.println("X:::methodX"); }}interface Y { default void methodX() { System.out.println("Y:::methodX"); }} public class Z implements X, Y { public void methodX() { // what to do here??? } public static void main(String args[]) { Z z = new Z(); z.methodX(); }}
有两种方法可以处理这个问题。
- 用自己的逻辑覆盖类方法
- 用继承的接口实现之一覆盖类方法
覆盖:提供自己的逻辑
public class Z implements X, Y { public void methodX() { System.out.println("ZClass:::methodX"); } public static void main(String args[]) { Z obj = new Z(); obj.methodX(); }}
Override:提供继承的类实现
public class Z implements X, Y { public void methodX() { X.super.methodX(); // OR Y.super.methodX(); } public static void main(String args[]) { Z obj = new Z(); obj.methodX(); }}
通过这种方式,我们可以根据我们的要求消除常用方法中的歧义——方法 1 或 2……
这都是关于继承 Java 中的菱形问题。 我们也讨论了解决这种情况的另一种方法……所以,现在是时候结束了!!! 在这里阅读并分享您的想法..
关注七爪 ,获取更多APP/小程序/ 站源码资源!
声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!