JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

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

wys521 2024-11-27 12:16:58 精选教程 16 ℃ 0 评论

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

嗨,大家好! 今天我们可以讨论我们在 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/小程序/网站源码资源!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表