Java三大特性之繼承詳解
概述
由來
多個類中存在相同屬性和行為時,將這些內(nèi)容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承那一個類即可。如圖所示:
其中,多個類可以稱為子類,單獨那一個類稱為父類、超類(superclass)或者基類。 繼承描述的是事物之間的所屬關(guān)系,這種關(guān)系是: is-a 的關(guān)系。例如,圖中兔子屬于食草動物,食草動物屬于動 物。可見,父類更通用,子類更具體。我們通過繼承,可以使多種事物之間形成一種關(guān)系體系。
定義
繼承:就是子類繼承父類的屬性和行為,使得子類對象具有與父類相同的屬性、相同的行為。子類可以直接 訪問父類中的非私有的屬性和行為。
好處
- 提高代碼的復(fù)用性。
- 類與類之間產(chǎn)生了關(guān)系,是多態(tài)的前提。
繼承的格式
通過 extends 關(guān)鍵字,可以聲明一個子類繼承另外一個父類,定義格式如下:
class 父類 { ... } class 子類 extends 父類 { ... }
繼承演示,代碼如下:
/* * 定義員工類Employee,做為父類 */ class Employee { String name; // 定義name屬性 // 定義員工的工作方法 public void work() { System.out.println("盡心盡力地工作"); } } /* * 定義講師類Teacher 繼承 員工類Employee */ class Teacher extends Employee { // 定義一個打印name的方法 public void printName() { System.out.println("name=" + name); } } /* * 定義測試類 */ public class ExtendDemo01 { public static void main(String[] args) { // 創(chuàng)建一個講師類對象 Teacher t = new Teacher(); // 為該員工類的name屬性進(jìn)行賦值 t.name = "小明"; // 調(diào)用該員工的printName()方法 t.printName(); // name = 小明 // 調(diào)用Teacher類繼承來的work()方法 t.work(); // 盡心盡力地工作 } }
繼承后的特點—成員變量
當(dāng)類之間產(chǎn)生了關(guān)系后,其中各類中的成員變量,又產(chǎn)生了哪些影響呢?
成員變量不重名
如果子類父類中出現(xiàn)不重名的成員變量,這時的訪問是沒有影響的。代碼如下:
class Fu { // Fu中的成員變量。 int num = 5; } class Zi extends Fu { // Zi中的成員變量 int num2 = 6; // Zi中的成員方法 public void show() { // 訪問父類中的num, System.out.println("Fu num="+num); // 繼承而來,所以直接訪問。 // 訪問子類中的num2 System.out.println("Zi num2="+num2); } } class ExtendDemo02 { public static void main(String[] args) { // 創(chuàng)建子類對象 Zi z = new Zi(); // 調(diào)用子類中的show方法 z.show(); } }
演示結(jié)果:
Fu num = 5
Zi num2 = 6
成員變量重名
如果子類父類中出現(xiàn)重名的成員變量,這時的訪問是有影響的。代碼如下:
class Fu { // Fu中的成員變量。 int num = 5; } class Zi extends Fu { // Zi中的成員變量 int num = 6; public void show() { // 訪問父類中的num System.out.println("Fu num=" + num); // 訪問子類中的num System.out.println("Zi num=" + num); } } class ExtendsDemo03 { public static void main(String[] args) { // 創(chuàng)建子類對象 Zi z = new Zi(); // 調(diào)用子類中的show方法 z.show(); } }
演示結(jié)果:
Fu num = 6
Zi num = 6
子父類中出現(xiàn)了同名的成員變量時,在子類中需要訪問父類中非私有成員變量時,需要使用super 關(guān)鍵字,修飾 父類成員變量 。 使用格式:
super.父類成員變量名
子類方法需要修改,代碼如下:
class Zi extends Fu { // Zi中的成員變量 int num = 6; public void show() { //訪問父類中的num System.out.println("Fu num=" + super.num); //訪問子類中的num System.out.println("Zi num=" + this.num); } }
演示結(jié)果:
Fu num = 5
Zi num = 6
小貼士:Fu 類中的成員變量是非私有的,子類中可以直接訪問。若Fu 類中的成員變量私有了,子類是不能 直接訪問的。通常編碼時,我們遵循封裝的原則,使用private修飾成員變量,那么如何訪問父類的私有成員 變量呢?對!可以在父類中提供公共的getXxx方法和setXxx方法。
繼承后的特點—成員方法
當(dāng)類之間產(chǎn)生了關(guān)系,其中各類中的成員方法,又產(chǎn)生了哪些影響呢?
成員方法不重名
如果子類父類中出現(xiàn)不重名的成員方法,這時的調(diào)用是沒有影響的。對象調(diào)用方法時,會先在子類中查找有沒有對應(yīng)的方法,若子類中存在就會執(zhí)行子類中的方法,若子類中不存在就會執(zhí)行父類中相應(yīng)的方法。代碼如下:
class Fu{ public void show(){ System.out.println("Fu類中的show方法執(zhí)行"); } } class Zi extends Fu{ public void show2(){ System.out.println("Zi類中的show2方法執(zhí)行"); } } public class ExtendsDemo04{ public static void main(String[] args) { Zi z = new Zi(); //子類中沒有show方法,但是可以找到父類方法去執(zhí)行 z.show(); z.show2(); } }
成員方法重名—重寫(Override)
如果子類父類中出現(xiàn)重名的成員方法,這時的訪問是一種特殊情況,叫做方法重寫 (Override)。 方法重寫 :子類中出現(xiàn)與父類一模一樣的方法時(返回值類型,方法名和參數(shù)列表都相同),會出現(xiàn)覆蓋效 果,也稱為重寫或者復(fù)寫。聲明不變,重新實現(xiàn)。 代碼如下:
class Fu { public void show() { System.out.println("Fu show"); } } class Zi extends Fu { //子類重寫了父類的show方法 public void show() { System.out.println("Zi show"); } } public class ExtendsDemo05{ public static void main(String[] args) { Zi z = new Zi(); // 子類中有show方法,只執(zhí)行重寫后的show方法 z.show(); // Zi show } }
重寫的應(yīng)用
子類可以根據(jù)需要,定義特定于自己的行為。既沿襲了父類的功能名稱,又根據(jù)子類的需要重新實現(xiàn)父類方法,從而進(jìn)行擴(kuò)展增強(qiáng)。比如新的手機(jī)增加來電顯示頭像的功能,代碼如下:
class Phone { public void sendMessage(){ System.out.println("發(fā)短信"); } public void call(){ System.out.println("打電話"); } public void showNum(){ System.out.println("來電顯示號碼"); } }
//智能手機(jī)類 class NewPhone extends Phone { //重寫父類的來電顯示號碼功能,并增加自己的顯示姓名和圖片功能 public void showNum(){ //調(diào)用父類已經(jīng)存在的功能使用super super.showNum(); //增加自己特有顯示姓名和圖片功能 System.out.println("顯示來電姓名"); System.out.println("顯示頭像"); } } public class ExtendsDemo06 { public static void main(String[] args) { // 創(chuàng)建子類對象 NewPhone np = new NewPhone(); // 調(diào)用父類繼承而來的方法 np.call(); // 調(diào)用子類重寫的方法 np.showNum(); } }
小貼士:這里重寫時,用到super.父類成員方法,表示調(diào)用父類的成員方法。
注意事項
- 子類方法覆蓋父類方法,必須要保證權(quán)限大于等于父類權(quán)限。
- 子類方法覆蓋父類方法,返回值類型、函數(shù)名和參數(shù)列表都要一模一樣。
繼承后的特點—構(gòu)造方法
當(dāng)類之間產(chǎn)生了關(guān)系,其中各類中的構(gòu)造方法,又產(chǎn)生了哪些影響呢? 首先我們要回憶兩個事情,構(gòu)造方法的定義格式和作用。
- 構(gòu)造方法的名字是與類名一致的。所以子類是無法繼承父類構(gòu)造方法的。
- 構(gòu)造方法的作用是初始化成員變量的。所以子類的初始化過程中,必須先執(zhí)行父類的初始化動作。子類的構(gòu)
造方法中默認(rèn)有一個super() ,表示調(diào)用父類的構(gòu)造方法,父類成員變量初始化后,才可以給子類使用。代碼如下:
class Fu { private int n; Fu(){ System.out.println("Fu()"); } } class Zi extends Fu { Zi(){ // super(),調(diào)用父類構(gòu)造方法 super(); System.out.println("Zi()"); } } public class ExtendsDemo07{ public static void main (String args[]){ Zi zi = new Zi(); } }
輸出結(jié)果:
Fu()
Zi()
到此這篇關(guān)于Java三大特性之繼承詳解的文章就介紹到這了,更多相關(guān)Java繼承內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC下 bootStrap服務(wù)器分頁代碼
因為Spring 對于ajax直接返回對象,到了WEB頁面就轉(zhuǎn)換成json 所以不需要使用JSON轉(zhuǎn)換封裝可以直接使用。接下來通過本文給大家分享Spring MVC下 bootStrap服務(wù)器分頁代碼,需要的的朋友參考下2017-03-03關(guān)于各種排列組合java算法實現(xiàn)方法
這篇文章介紹了幾種用JAVA實現(xiàn)的排列組合算法,有需要的朋友可以參考一下2013-06-06MyBatis深入解讀動態(tài)SQL的實現(xiàn)
動態(tài) SQL 是 MyBatis 的強(qiáng)大特性之一。如果你使用過 JDBC 或其它類似的框架,你應(yīng)該能理解根據(jù)不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態(tài) SQL,可以徹底擺脫這種痛苦2022-04-04SpringBoot導(dǎo)入導(dǎo)出數(shù)據(jù)實現(xiàn)方法詳解
這篇文章主要介紹了SpringBoot導(dǎo)入導(dǎo)出數(shù)據(jù)實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12