繼承
在代碼中,如果一個類通過extends關(guān)鍵字繼承了其他類,那么這個類是其他類的子類,其他類是這個類的父類。
? 一個類想要繼承其他類,那么這個類與被繼承的類之間必須要確實具備有繼承關(guān)系,不止要遵循語法邏輯,還要符合生活邏輯。
class Plant {
System.out.println();
}
class Dog extends Plant {}
比方說? 讓狗類去繼承植物類,語法上沒有問題,但是不符合生活邏輯。
繼承的應(yīng)用場景:
? 當(dāng)多個類中都具備相同的屬性或功能時,可以將他們之間相同的屬性和功能提取出來放入一個共性類中,并讓其他類繼承這個類。
? 比如學(xué)生類、老師類、工人類、他們之間相同的屬性和功能都可以在? 人? 這個共性類中找到。所以可以把 姓名 年齡 身高體重這些相同的屬性,還有吃飯睡覺等等這些共性行為都放入到 人 這個共性類中,讓其他幾個類來繼承,然后個各類中加入他們特有的屬性和行為就可以了。
? 這樣做的好處是提高代碼的復(fù)用性,讓類與類之間產(chǎn)生了關(guān)系,給多態(tài)的產(chǎn)生提供了前提。 (父類的引用指向子類的對象)
在Java中,允許單繼承。(不直接允許多繼承)
? 單繼承即一個子類只能繼承一個父類。如果繼承多個父類,當(dāng)父類中有同名方法時,調(diào)用可能會產(chǎn)生不確定性。
繼承在使用時的特點:
1、在創(chuàng)建子類對象時,會首先自動調(diào)用父類的構(gòu)造方法。這里是為了初始化父類的成員變量,來方便子類使用。(子類所有的構(gòu)造函數(shù)都會去訪問父類中的默認(rèn)空參構(gòu)造函數(shù),因為子類的構(gòu)造函數(shù)第一行都有一個隱式的super();)
2、父類中的非私有化成員變量和成員方法,子類在繼承之后可以獲得使用權(quán)。
3、在父類中用private修飾的? 私有化成員變量和私有化成員方法不能通過該類的子類對象調(diào)用。
? ? 私有化的成員變量和成員方法只能在當(dāng)前類的內(nèi)部使用,外部沒有使用權(quán)限。
super關(guān)鍵字
1、super關(guān)鍵字可以在子類中直接調(diào)用父類的成員方法。
2、當(dāng)父類中沒有定義空參構(gòu)造函數(shù)時,使用:super(實際參數(shù))? Java編譯器會根據(jù)不同的參數(shù)類型調(diào)用不同的構(gòu)造方法
3、this()或者super()只能定義在構(gòu)造函數(shù)的第一行,因為初始化動作要先執(zhí)行。this();和super();不能同時出現(xiàn)在一個代碼里
4、在子類的構(gòu)造函數(shù)中如果沒有通過super指定調(diào)用父類的構(gòu)造方法,那么編譯器會自動調(diào)用父類的無參構(gòu)造函數(shù)(隱式super();)? 所以建議在繼承關(guān)系中,父類中最好提供一個無參構(gòu)造函數(shù)。
this回顧
this關(guān)鍵字調(diào)用構(gòu)造函數(shù)的方法:
1、this(實際參數(shù)),Java編譯器會根據(jù)不同的參數(shù)類型調(diào)用不同的構(gòu)造方法。
2、如果用this關(guān)鍵字調(diào)用構(gòu)造方法,必須在當(dāng)前代碼塊的第一行。否則執(zhí)行的是第一行的隱式super();
3、this關(guān)鍵字調(diào)用構(gòu)造方法時不能相互調(diào)用。
方法的重寫
? ? 當(dāng)子類繼承父類時,繼承而來的方法可能并不適合子類的實際情況,這個時候為了讓繼承而來的方法更加適合子類的實際情況,可以選擇重寫這個方法。
定義:
? ? 當(dāng)子類中存在和父類同名、同參、同返回值類型的方法,這種情況稱之為方法的【重寫】
? ? 方法的【重載】是在同一個類中,方法的方法名相同,參數(shù)不同、參數(shù)個數(shù)不同或者返回值類型不同。它的作用是為了減少代碼復(fù)雜度(函數(shù)名)。
? ? 在重寫方法時,為了保證代碼的嚴(yán)謹(jǐn)性,通常會開啟嚴(yán)格的重寫檢查 @override,將邏輯問題上升到語法問題,強制重寫這個方法,不寫就報錯,目的是錯誤前置(將運行時異常前置為編譯時異常)。這個時候就會用到一個關(guān)鍵字abstract。
abstract關(guān)鍵字的特點
1、如果一個方法用abstract修飾,那么這個方法是不能有方法體的,這個稱之為【方法的聲明】。? 所謂方法體就是{}以及里面的內(nèi)容。
2、如果一個方法用abstract修飾,要求繼承該類的子類必須重寫這個方法。
3、如果一類中存在用abstract修飾的方法,那么這個類也必須用abstract修飾。這個類也稱之為抽象類。
抽象類
抽象類沒有自己的類對象
在用abstract修飾的抽象類中,有可能存在抽象方法,而抽象方法是沒有方法體的,不能確定會運行什么代碼,而創(chuàng)建抽象類對象之后就會存在這樣的隱患。所以抽象類沒有自己的類對象。
如果一個類繼承了用abstract修飾的抽象類,那么要求該類必須實現(xiàn)抽象類中的【所有方法】。
abstract關(guān)鍵字不和哪些關(guān)鍵字共存
1、final? ? :final修飾的類能再派生子類。
2、private? :私有以后子類無法繼承父類。
3、static? :靜態(tài)可以直接被類名調(diào)用。
回顧一下final
final是一個修飾符,它可以修飾類、方法、變量(成員/局部變量)
特點:
1、final修飾的類是一個最終類,不能再派生子類。
2、final修飾的方法是最終方法,不能被重寫。
3、final修飾的變量是一個常量,只能被賦值一次。
被final修飾的常量名應(yīng)該大寫,用_連接。