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 不支援類的多重繼承,但我們可以使用介面代替類來達到同樣的目的。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP