Java 多继承

Java 多继承

在Java中,我们使用继承来创建一个类和对象的层级分类。顾名思义,继承是一个类具备继承另一个类的成员的能力。被继承属性的类被称为超类,而继承超类的类被称为子类。我们使用extends关键字继承类。Java有几种类型的继承,如单继承和多级继承。本文将特别探讨多继承。

Java中的多继承

在面向对象编程的术语中,多继承是单个子类继承多个超类的能力。与其他面向对象编程语言不同,Java不支持类的多继承,而是允许接口的多继承。

多继承的视觉表示如下:

Java 多继承

为什么Java不支持类的多继承

简而言之,这是为了避免歧义。在上图中,我们可以看到类C同时继承了类A和类B。假设两个类都有相同的display()方法。在这种情况下,Java编译器无法决定应该调用哪个display方法。因此,为了避免这种歧义,Java限制了类的多继承。一个典型的歧义问题就是菱形问题。

示例

下面的示例说明了如果尝试多继承类会产生什么结果。

class Event { // first superclass 
   public void start() {
      System.out.println("Start Event");
   }
}
class Sports { // 2nd superclass 
   public void play() {
      System.out.println("Play Sports.");
   }
}
// subclass extending both superclass
class Hockey extends Sports, Event {
   public void show() {
      System.out.println("Show Hockey.");
   }
}
public class Tester{
   public static void main(String[] args) {
      // creating instance of subclass
      Hockey hockey = new Hockey();
      // calling the method of subclass
      hockey.show(); 
   }
}

输出

Tester.java:12: error: '{' expected
class Hockey extends Sports, Event {
                           ^
1 error

错误显示,尽管使用不同方法,Java不支持类的多重继承。

为什么Java支持接口的多重继承

在Java中,接口具有纯抽象和多重继承的两个目的。一般来说,接口由定义类可以实现的行为的抽象方法和变量组成。这里,抽象方法是一种没有实现或函数体的方法,并且使用abstract关键字进行声明。

由于抽象方法的特性,Java允许接口的多重继承。抽象方法不包含任何定义,如果我们要使用它,需要在子类中定义它。这样,该方法只有一个定义存在,并且我们可以轻松实现多重继承。

要创建一个接口,我们使用关键字 “interface”,要在类中访问接口的成员,我们需要在定义该类时使用 “implements” 关键字。

语法

interface nameOfInterface {
   method1();
   method2();
}

示例

下面的示例说明了使用接口实现多重继承的实际实现。

interface Event { // interface 1
   public void start();
}
interface Sports { // interface 2
   public void play();
}
// another interface extending 1st and 2nd interface
interface Hockey extends Sports, Event{
   public void show();
}
public class Tester{
   public static void main(String[] args){
      // creating instance of hockey
      Hockey hockey = new Hockey() {
         // implementing the methods of interfaces
         public void start() {
            System.out.println("Start Event");
         }
         public void play() {
            System.out.println("Play Sports");
         }
         public void show() {
            System.out.println("Show Hockey");
         }
      };
      // calling the methods using instance
      hockey.start();
      hockey.play();
      hockey.show();
   }   
}

输出

Start Event
Play Sports
Show Hockey

示例

在这个示例中,我们将声明两个具有相同名称但签名不同的方法的接口,然后尝试实现多重继承。

interface Message1 { // interface 1
   public void method();
}
interface Message2 { // interface 2
   public void method(int id);
}
public class IntrfExample3 implements Message1, Message2 {
   // using the method here with different definition
   public void method() {
      System.out.println("Tutorialspoint");
   }
   public void method(int id) {
      System.out.println("ID: " + id);
   }
   public static void main(String []args){
      // object creation
      IntrfExample3 exp = new IntrfExample3();
      // method calling
      exp.method(); 
      exp.method(125);
   }
}

输出

Tutorialspoint
ID: 125

结论

我们通过定义继承来开始了本文,并且在接下来的部分讨论了多重继承,多重继承是一种子类继承两个或更多超类的属性的类型。一般来说,Java不支持类的多重继承,但我们可以使用接口代替类来达到相同的目的。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程