更新時(shí)間:2021-06-15 來(lái)源:黑馬程序員 瀏覽量:
在現(xiàn)實(shí)生活中,說(shuō)到繼承,多會(huì)想到子女繼承父輩的財(cái)產(chǎn)、事業(yè)等。在程序中,繼承描述的是事物之間的所屬關(guān)系,通過(guò)繼承可以使多種事物之間形成一種關(guān)聯(lián)體系。例如貓和狗都屬于動(dòng)物,程序中便可以描述為貓和狗繼承自動(dòng)物;同理,波斯貓和巴厘貓繼承自貓,而沙皮狗和斑點(diǎn)狗繼承自狗。這些動(dòng)物之間會(huì)形成一個(gè)繼承體系,如圖1所示。
在Java中,類(lèi)的繼承是指在一個(gè)現(xiàn)有類(lèi)的基礎(chǔ)上去構(gòu)建一個(gè)新的類(lèi),構(gòu)建出來(lái)的新類(lèi)被稱(chēng)作子類(lèi),現(xiàn)有類(lèi)被稱(chēng)作父類(lèi)或基類(lèi),子類(lèi)會(huì)自動(dòng)擁有父類(lèi)所有可繼承的屬性和方法。
在程序中,如果想聲明一個(gè)類(lèi)繼承另一個(gè)類(lèi),需要使用extends關(guān)鍵字,其基本語(yǔ)法格式如下:
[修飾符] class 子類(lèi)名 extends 父類(lèi)名 { // 程序核心代碼 }
在上述語(yǔ)法格式中,類(lèi)的修飾符是可選的,用來(lái)指定類(lèi)的訪問(wèn)權(quán)限,可以使用public或者省略不寫(xiě);子類(lèi)名和父類(lèi)名都是必選的,并且子類(lèi)與父類(lèi)之間要使用extends關(guān)鍵字實(shí)現(xiàn)繼承關(guān)系。
接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)子類(lèi)是如何繼承父類(lèi)的,如文件1所示。
文件1 Example01.java
// 定義Animal類(lèi) class Animal { String name; // 聲明name屬性 // 定義動(dòng)物叫的方法 void shout() { System.out.println("動(dòng)物發(fā)出叫聲"); } } // 定義Dog類(lèi)繼承Animal類(lèi) class Dog extends Animal { // 定義一個(gè)打印name的方法 public void printName() { System.out.println("name=" + name); } } // 定義測(cè)試類(lèi) public class Example01 { public static void main(String[] args) { Dog dog = new Dog(); // 創(chuàng)建一個(gè)Dog類(lèi)的實(shí)例對(duì)象 dog.name = "沙皮狗"; // 為dog對(duì)象的name屬性進(jìn)行賦值 dog.printName(); // 調(diào)用dog對(duì)象的printName()方法 dog.shout(); // 調(diào)用Dog類(lèi)繼承來(lái)的shout()方法 } }
運(yùn)行結(jié)果如圖2所示。
圖2 運(yùn)行結(jié)果
在文件1中,Dog類(lèi)通過(guò)extends關(guān)鍵字繼承了Animal類(lèi),這樣Dog類(lèi)便是Animal類(lèi)的子類(lèi)。從圖2可以看出,子類(lèi)雖然沒(méi)有聲明name屬性和shout()方法,但是卻能訪問(wèn)這兩個(gè)成員。這就說(shuō)明,子類(lèi)在繼承父類(lèi)的時(shí)候,會(huì)自動(dòng)擁有父類(lèi)所有公共的成員。
在實(shí)現(xiàn)類(lèi)的繼承中,需要注意一些問(wèn)題,具體如下:
(1)在Java中,類(lèi)只支持單繼承,不允許多重繼承,也就是說(shuō)一個(gè)類(lèi)只能有一個(gè)直接父類(lèi),例如下面這種情況是不合法的。
class A{} class B{} class C extends A,B{} // C類(lèi)不可以同時(shí)繼承A類(lèi)和B類(lèi)
(2)多個(gè)類(lèi)可以繼承同一個(gè)父類(lèi),例如下面這種情況是允許的。
class A{} class B extends A{} class C extends A{} // 類(lèi)B和類(lèi)C都可以繼承類(lèi)A
(3)在Java中,多層繼承是可以的,即一個(gè)類(lèi)的父類(lèi)可以再去繼承另外的父類(lèi),例如下面這種情況是允許的。
class A{} class B extends A{} // 類(lèi)B繼承類(lèi)A,類(lèi)B是類(lèi)A的子類(lèi) class C extends B{} // 類(lèi)C繼承類(lèi)B,類(lèi)C是類(lèi)B的子類(lèi),同時(shí)也是類(lèi)A的子類(lèi)
(4)在Java中,子類(lèi)和父類(lèi)是一種相對(duì)概念,也就是說(shuō),一個(gè)類(lèi)是某個(gè)類(lèi)父類(lèi)的同時(shí),也可以是另一個(gè)類(lèi)的子類(lèi)。例如上面的第3個(gè)示例中,B類(lèi)是A類(lèi)的子類(lèi),同時(shí)又是C類(lèi)的父類(lèi)。
java基礎(chǔ)之面向?qū)ο?繼承、接口、多態(tài)
Scala子類(lèi)繼承父類(lèi)的方法【黑馬程序員】