鍍金池/ 教程/ Java/ Java繼承
Java for循環(huán)
Java接口
Java是什么?
Java命名約定
java中方法重載和方法重寫的區(qū)別
Java運(yùn)算符
Java抽象類
Java快速入門
Java實例初始化程序塊
Java靜態(tài)綁定和動態(tài)綁定
Java do-while循環(huán)
Java對象克隆
Java Object類
Java聚合
Java繼承
Java this關(guān)鍵字
Java虛擬機(jī)內(nèi)部體系結(jié)構(gòu)
Java構(gòu)造器(構(gòu)造方法)
Eclipse安裝和配置
Java多態(tài)
Java方法重載
Java while循環(huán)
Java教程
Java按值調(diào)用和引用調(diào)用
Java strictfp關(guān)鍵字
Java封裝
Java語言特點
Java數(shù)組
Java instanceof運(yùn)算符
Java包裝類
Java命令行參數(shù)
Java包
Java面向?qū)ο螅∣OP)概念
簡單Java程序
Java基礎(chǔ)實例程序
Java對象和類
Java continue語句
Java抽象類和接口的區(qū)別
C++ VS Java比較
Java if/else語句
Java switch語句
Java歷史
Java變量和數(shù)據(jù)類型
安裝Java環(huán)境(Linux)
Java JDK安裝和配置
Hello Java程序的內(nèi)部細(xì)節(jié)
Java break語句
Java方法重寫
Java Unicode編碼系統(tǒng)
怎么樣開始學(xué)習(xí)Java編程?
對象和類之間的區(qū)別
Java訪問修飾符
Java super關(guān)鍵字
Java注釋
JDK,JRE和JVM之間的區(qū)別
Java final關(guān)鍵字
Java static關(guān)鍵字

Java繼承

Java中的繼承是一種機(jī)制,表示為一個對象獲取父對象的所有屬性和行為。

在Java中繼承是:可以創(chuàng)建基于現(xiàn)有類構(gòu)建新的類。 當(dāng)您從現(xiàn)有類繼承時,就可以重復(fù)使用父類的方法和字段,也可以在繼承的新類中添加新的方法和字段。

繼承表示IS-A關(guān)系,也稱為父子關(guān)系。

為什么在java中使用繼承?

對于方法覆蓋(因此可以實現(xiàn)運(yùn)行時的多態(tài)性),提高代碼可重用性。在Java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫(覆蓋)。

Java繼承的語法

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

extends關(guān)鍵字表示正在從現(xiàn)有類派生創(chuàng)建的新類。 “extends”的含義是增加功能。在Java的術(shù)語中,繼承的類稱為父類或超類,新類稱為子或子類。

Java繼承示例

如上圖所示,Programmer是子類,Employee是超類。 兩個類之間的關(guān)系是Programmer IS-A Employee. 它表示 Programmer 是一種 Employee 的類型。

參考下面示例代碼的實現(xiàn) -

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);
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

Programmer salary is:40000.0
Bonus of programmer is:10000

在上面的例子中,Programmer對象可以訪問自身類以及Employee類的字段,即提高了代碼可重用性。

java繼承類型

在類的基礎(chǔ)上,在java中可以有三種類型的繼承:單一,多級和分層。在Java編程中,僅能通過接口支持多重和混合繼承。稍后章節(jié)中我們將了解學(xué)習(xí)接口的應(yīng)用。

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

當(dāng)一個類擴(kuò)展多個類,即被稱為多重繼承。 例如:

(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();
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

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();
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

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
    }
}

執(zhí)行上面代碼得到以下結(jié)果 -

meowing...
eating...

問題:為什么在Java中不支持多重繼承?

為了降低復(fù)雜性并簡化語言,Java中不支持多重繼承。想象一個:ABC是三個類。 C類繼承AB類。 如果AB類有相同的方法,并且從子類對象調(diào)用它,AB類的調(diào)用方法會有歧義。

因為編譯時錯誤比運(yùn)行時錯誤好,如果繼承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?
    }
}