如何使用Java中的默认方法解决菱形问题


继承是两个类之间的关系,其中一个类继承另一个类的属性。这种关系可以使用extends关键字定义为:

public class A extends B{

}

继承属性的类称为子类或子类,其属性被继承的类称为超类或父类。

在继承中,超类成员的副本在子类对象中创建。因此,使用子类对象,您可以访问这两个类的成员。

多重继承是指一个类继承多个类的属性。换句话说,在多重继承中,我们可以有一个子类和n个父类。Java不支持多重继承(使用类)。

菱形问题

  • 例如,让我们假设Java支持多重继承。
  • 如果我们有一个名为Sample的抽象类,其中包含一个抽象方法demo()。
  • 然后,如果同一包中的另外两个类扩展此类并尝试实现其抽象方法demo()。
  • 那么,根据继承的基本规则,应该在子类对象中创建两个demo()方法的副本,这使得子类有两个具有相同原型(名称和参数)的方法。
  • 然后,如果您使用子类对象调用demo()方法,编译器将面临一个不明确的情况,不知道要调用哪个方法。这个问题在Java中被称为菱形问题。

菱形问题的解决方案

您可以使用默认方法(Java 8)和接口在Java中实现多重继承。

从Java 8开始,在接口中引入了默认方法。与其他抽象方法不同,这些是具有默认实现的接口方法。如果您在接口中具有默认方法,则不必在已经实现此接口的类中覆盖(提供主体)它。

您可以在两个不同的接口中拥有相同的默认方法(相同的名称和签名),并且您可以从一个类实现这两个接口。

如果您这样做,则必须显式地覆盖来自类的默认方法,并同时指定默认方法及其接口名称。

示例

在线演示

interface MyInterface1{  
   public static int num = 100;
   public default void display() {
      System.out.println("display method of MyInterface1");
   }
}
interface MyInterface2{  
   public static int num = 1000;
   public default void display() {
      System.out.println("display method of MyInterface2");
   }
}  
public class InterfaceExample implements MyInterface1, MyInterface2{
   public void display() {
      MyInterface1.super.display();
      //or,
      MyInterface2.super.display();
   }      
   public static void main(String args[]) {
      InterfaceExample obj = new InterfaceExample();
      obj.display();
   }
}

输出

display method of MyInterface1
display method of MyInterface2

更新于:2021年2月8日

13K+ 浏览量

开启您的职业生涯

完成课程获得认证

开始学习
广告