Java 和多重繼承


在 Java 中,我們使用繼承來允許建立類的分層分類和物件。顧名思義,繼承是類繼承另一個類成員的能力。其屬性被繼承的類稱為超類,而繼承超類的類稱為子類。我們使用 extends 關鍵字來繼承類。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 不支援類的多重繼承,但我們可以使用介面代替類來達到同樣的目的。

更新於: 2023 年 8 月 10 日

8K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.