七爪源码:Java中的继承和钻石问题

让我们了解所有关于继承的知识

嗨,大家好! 今天我们可以讨论我们在 Java 中的 OOP 中的一个概念。 其实这也是我面试的时候问的。 所以,我决定写我已经知道的东西。 但是除了解释继承之外,还有更多的事实!! 更多的焦点将放在钻石问题上,以及解决它的替代方法是什么……

什么是继承?

继承是两个类之间的关系/关联,其中一个类继承另一个类的属性。 这种关系是使用 Java 中的 extends 关键字定义的,如下所示。

public class X extends Y {}

这是 IS-A 关系。 让我们举个例子。 我们可以将 Vehicle 和 Car 定义为两个相关的类,其中 Vehicle 是父类,Car 是子类。 在这里,汽车就是汽车!!! 不是吗?

我不会深入解释继承。 但是我们可以简要讨论一下我们拥有的继承类型。

  • 单一继承 – 仅将一个类扩展 1 个类
  • public class X {}public class X extends Y {}
  • 多级继承——从派生类扩展类,后跟关联顺序
  • public class X {}public class Y extends X {}public class Z extends Y {}
  • Hierarchical Inheritance — 扩展具有相同父类的类集
  • 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();   }}

    有两种方法可以处理这个问题。

    1. 用自己的逻辑覆盖类方法
    2. 用继承的接口实现之一覆盖类方法

    覆盖:提供自己的逻辑

    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/小程序/ 站源码资源!

    声明:本站部分文章内容及图片转载于互联 、内容不代表本站观点,如有内容涉及侵权,请您立即联系本站处理,非常感谢!

    (0)
    上一篇 2022年7月8日
    下一篇 2022年7月9日

    相关推荐