Java中的繼承是一種機(jī)制,表示為一個對象獲取父對象的所有屬性和行為。
在Java中繼承是:可以創(chuàng)建基于現(xiàn)有類構(gòu)建新的類。 當(dāng)您從現(xiàn)有類繼承時,就可以重復(fù)使用父類的方法和字段,也可以在繼承的新類中添加新的方法和字段。
繼承表示IS-A關(guān)系,也稱為父子關(guān)系。
對于方法覆蓋(因此可以實現(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
類的字段,即提高了代碼可重用性。
在類的基礎(chǔ)上,在java中可以有三種類型的繼承:單一,多級和分層。在Java編程中,僅能通過接口支持多重和混合繼承。稍后章節(jié)中我們將了解學(xué)習(xí)接口的應(yīng)用。
注意:在java中的類不支持多繼承。
當(dāng)一個類擴(kuò)展多個類,即被稱為多重繼承。 例如:
文件 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...
文件 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...
文件 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中不支持多重繼承。想象一個:A,B和C是三個類。 C類繼承A和B類。 如果A和B類有相同的方法,并且從子類對象調(diào)用它,A或B類的調(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?
}
}