Java繼承


Java中的繼承是一種機制,表示為一個物件獲取父物件的所有屬性和行為。

在Java中繼承是:可以建立基於現有類構建新的類。 當您從現有類繼承時,就可以重複使用父類別的方法和欄位,也可以在繼承的新類中新增新的方法和欄位。

繼承表示IS-A關係,也稱為父子關係。

為什麼在java中使用繼承?

對於方法覆蓋(因此可以實現執行時的多型性),提高程式碼可重用性。在Java中,子類可繼承父類別中的方法,而不需要重新編寫相同的方法。但有時子類並不想原封不動地繼承父類別的方法,而是想作一定的修改,這就需要採用方法的重寫(覆蓋)。

Java繼承的語法

class Subclass-name extends Superclass-name  
{  
   //methods and fields  
}

extends關鍵字表示正在從現有類派生建立的新類。 「extends」的含義是增加功能。在Java的術語中,繼承的類稱為父類別或超類,新類稱為子或子類。

Java繼承範例

如上圖所示,Programmer是子類,Employee是超類。 兩個類之間的關係是Programmer IS-A Employee. 它表示 Programmer 是一種 Employee 的型別。

參考下面範例程式碼的實現 -

class Employee {
    float salary = 40000;
}

class Programmer extends Employee {
    int bonus = 10000;

    public static void main(String args[]) {
        Programmer p = new Programmer();
        System.out.println("Programmer salary is:" + p.salary);
        System.out.println("Bonus of Programmer is:" + p.bonus);
    }
}

執行上面程式碼得到以下結果 -

Programmer salary is:40000.0
Bonus of programmer is:10000

在上面的例子中,Programmer物件可以存取自身類以及Employee類的欄位,即提高了程式碼可重用性。

java繼承型別

在類的基礎上,在java中可以有三種型別的繼承:單一,多級和分層。在Java程式設計中,僅能通過介面支援多重和混合繼承。稍後章節中我們將了解學習介面的應用。

注意:在java中的類不支援多繼承。

當一個類擴充套件多個類,即被稱為多重繼承。 例如:

(1). 單一繼承範例

檔案 TestInheritance.java 中的程式碼如下 -

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("barking...");
    }
}

class TestInheritance {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.bark();
        d.eat();
    }
}

執行上面程式碼得到以下結果 -

barking...
eating...

(2). 多級繼承範例

檔案 TestInheritance2.java 中的程式碼如下 -

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("barking...");
    }
}

class BabyDog extends Dog {
    void weep() {
        System.out.println("weeping...");
    }
}

class TestInheritance2 {
    public static void main(String args[]) {
        BabyDog d = new BabyDog();
        d.weep();
        d.bark();
        d.eat();
    }
}

執行上面程式碼得到以下結果 -

weeping...
barking...
eating...

(3). 多級繼承範例

檔案 TestInheritance3.java 中的程式碼如下 -

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("barking...");
    }
}

class Cat extends Animal {
    void meow() {
        System.out.println("meowing...");
    }
}

class TestInheritance3 {
    public static void main(String args[]) {
        Cat c = new Cat();
        c.meow();
        c.eat();
        // c.bark();//C.T.Error
    }
}

執行上面程式碼得到以下結果 -

meowing...
eating...

問題:為什麼在Java中不支援多重繼承?

為了降低複雜性並簡化語言,Java中不支援多重繼承。想象一個:ABC是三個類。 C類繼承AB類。 如果AB類有相同的方法,並且從子類物件呼叫它,AB類的呼叫方法會有歧義。

因為編譯時錯誤比執行時錯誤好,如果繼承2個類,java會在編譯時報告錯誤。 所以無論子類中是否有相同的方法,都會有報告編譯時錯誤。例如下面的程式碼是編譯出錯的。

class A {
    void msg() {
        System.out.println("Hello");
    }
}

class B {
    void msg() {
        System.out.println("Welcome");
    }
}

class C extends A,B
{//suppose if it were  

 Public Static

    void main(String args[]) {
        C obj = new C();
        obj.msg();// Now which msg() method would be invoked?
    }
}