Java是否支持多重继承?为什么?我们该如何解决呢?

每当您扩展类时,子类对象都可以使用超类成员的副本,并且可以使用子类的对象调用超类的方法时。

示例

在下面的示例中,我们有一个名为SuperClass的类,其类名为name demo()。我们正在用另一个类(SubClass)扩展该类。

现在,您创建一个子类的对象,并调用方法demo()

class SuperClass{
   public void demo() {
      System.out.println("demo method");
   }
}
public class SubClass extends SuperClass {
   public static void main(String args[]) {
      SubClass obj = new SubClass();
      obj.demo();
   }
}

输出结果

demo method

Java中的多重继承

假设,如果我们有两个类,即SuperClass1和SuperClass2,它们使用相同的方法说demo()(包括参数),如下所示-

class SuperClass1{
   public void demo() {
      System.out.println("demo method");
   }
}
class SuperClass2{
   public void demo() {
      System.out.println("demo method");
   }
}

现在,从另一个类,如果将两个类都扩展为-

public class SubClass extends SuperClass1, SuperClass2 {
   public static void main(String args[]) {
      SubClass obj = new SubClass();
      obj.demo();
   }
}

根据继承的基本规则,demo()应在子类对象中创建两个方法的副本,这将使子类具有两个具有相同原型的方法。然后,如果demo()使用子类的对象调用该方法,则编译器将面临一种模棱两可的情况,即不知道要调用哪个方法。

因此,在Java中不允许多重继承,并且您不能扩展一个以上的其他类。但是,如果您尝试这样做,则会生成编译时错误。

编译时错误

在编译时,上述程序会产生以下错误-

MultipleInheritanceExample.java:9: error: '{' expected
public class MultipleInheritanceExample extends MyInterface1, MyInterface2{
                                                               ^
1 error

使用接口的多重继承

如果多个接口具有相同的默认方法。在实现两个接口的具体类中,可以实现通用方法并调用两个超级方法。因此,您可以使用接口在Java中实现多重继承。

示例

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() {
      System.out.println("This is the implementation of the display method");
   }
   public void show() {
      MyInterface1.super.display();
      MyInterface2.super.display();
   }

   public static void main(String args[]) {
      InterfaceExample obj = new InterfaceExample();
      obj.show();
   }
}

输出结果

display method of MyInterface1
display method of MyInterface2