Java筆記-面向?qū)ο?繼承

  • 繼承:

多個類中存在相同屬性和行為時,將這些內(nèi)容抽取到單獨(dú)一個類中,那么多個類無需再定義這些屬性和行為,只要繼承那個類即可。
多個類可以稱為子類,單獨(dú)這個類稱為父類、超類或者基類。
子類可以直接訪問父類中的非私有的屬性和行為。

通過extends關(guān)鍵字讓類與類之間產(chǎn)生繼承關(guān)系,以下是繼承的格式
class Student extends Person{} //Student是子類,Person是父類

  • 繼承的好處:
    可以提高代碼的復(fù)用性,讓類與類之間產(chǎn)生了關(guān)系,是多態(tài)的前提

  • 繼承的特點
    Java只支持單繼承,不支持多繼承,一個類只能有一個父類,不可以有多個父類。
    Java支持多層繼承(繼承體系),比如:

class B extends A{}
class C extends B{}```

繼承要注意的事項:

    0.如果類之間存在著:is a 的關(guān)系,就可以考慮使用繼承。
    1. 千萬不要為了減少重復(fù)代碼而去繼承,只有真正存在著繼承關(guān)系的時候才去繼承。
    2. 父類私有的成員不能被繼承。
    3. 父類的構(gòu)造函數(shù)不能被繼承。
    4. 創(chuàng)建子類對象時默認(rèn)會先調(diào)用父類無參的構(gòu)造函數(shù)。

- super關(guān)鍵字:

>super關(guān)鍵字代表了父類空間的引用。

super關(guān)鍵字的 作用:
    1. 子父類存在著同名的成員時,在子類中默認(rèn)是訪問子類的成員,可以通過super關(guān)鍵字指定訪問父類的成員。
    2. 創(chuàng)建子類對象時,默認(rèn)會先調(diào)用父類無參的構(gòu)造方法,可以通過super關(guān)鍵字指定調(diào)用父類的構(gòu)造方法。

super關(guān)鍵字調(diào)用父類構(gòu)造方法要注意的事項:
    1. 如果在子類的構(gòu)造方法上沒有指定調(diào)用父類的構(gòu)造方法,那么java編譯器會在子類的構(gòu)造方法上面加上super()語句。
    2. super關(guān)鍵字調(diào)用父類的構(gòu)造函數(shù)時,該語句必須要是子類構(gòu)造函數(shù)中的第一個語句。
    3. super與this關(guān)鍵字不能同時出現(xiàn)在同一個構(gòu)造函數(shù)中調(diào)用其他的構(gòu)造函數(shù)。因為兩個語句都需要第一個語句。


super關(guān)鍵字與this關(guān)鍵字的區(qū)別:
    1. 代表的事物不一致。
            1. super關(guān)鍵字代表的是父類空間的引用。 
            2. this關(guān)鍵字代表的是所屬函數(shù)的調(diào)用者對象。
    2. 使用前提不一致。
            1. super關(guān)鍵字必須要有繼承關(guān)系才能使用。
            2. this關(guān)鍵字不需要存在繼承關(guān)系也可使用。
    3. 調(diào)用構(gòu)造函數(shù)的區(qū)別:
            1. super關(guān)鍵字是調(diào)用父類的構(gòu)造函數(shù)。
            2. this關(guān)鍵字是調(diào)用本類的構(gòu)造函數(shù)。

- 方法重寫的前提: 必須要存在繼承的關(guān)系。
>方法的重寫: 子父類出了同名的函數(shù),這個我們就稱作為方法的重寫。

什么是時候要使用方法的重寫:父類的功能無法滿足子類的需求時。

方法重寫要注意的事項:
    1.方法重寫時, 方法名與形參列表必須一致。
    2.方法重寫時,子類的權(quán)限修飾符必須要大于或者等于父類的權(quán)限修飾符。
    3.方法重寫時,子類的返回值類型必須要小于或者 等于父類的返回值類型。
    4.方法重寫時, 子類拋出的異常類型要小于或者等于父類拋出的異常類型。
            Exception(最壞)
            RuntimeException(小壞)

方法的重載:在一個類中 存在兩個或者兩個 以上的同名函數(shù),稱作為方法重載。

方法重載的要求
    1. 函數(shù)名要一致。
    2. 形參列表不一致(形參的個數(shù)或形參 的類型不一致)
    3. 與返回值類型無關(guān)。

- 靜態(tài)代碼塊、構(gòu)造代碼塊,構(gòu)造方法的執(zhí)行順序:

父類靜態(tài)代碼塊→子類靜態(tài)代碼塊→父類構(gòu)造代碼塊→父類構(gòu)造方法→子類構(gòu)造代碼塊→子類構(gòu)造方法

- instanceof 關(guān)鍵字

instanceof關(guān)鍵字的作用:判斷一個對象是否屬于指定的類別。

instanceof關(guān)鍵字的使用前提:判斷的對象與指定的類別必須要存在繼承或者實現(xiàn)的關(guān)系。

instanceof關(guān)鍵字的使用格式:
        
        對象  instanceof 類別

instanceof關(guān)鍵字的作用: 目前沒用。但是后天我們學(xué)習(xí) 到了多態(tài)之后就非常有用。
一般我們做強(qiáng)制類型轉(zhuǎn)換之前都會使用該關(guān)鍵字先判斷一把,然后在進(jìn)行轉(zhuǎn)換的。


- final關(guān)鍵字
>每一個方法要運(yùn)行的時候,jvm虛擬機(jī)都會為該方法開辟一片存儲空間,方法中的形參也是屬于該方法的局部變量

final(最終、修飾符)  
    
final關(guān)鍵字的用法:
    1. final關(guān)鍵字修飾一個基本類型的變量時,該變量不能重新賦值,第一次的值為最終的。
    2. fianl關(guān)鍵字修飾一個引用類型變量時,該變量不能重新指向新的對象。
    3. final關(guān)鍵字修飾一個函數(shù)的時候,該函數(shù)不能被重寫。
    4. final關(guān)鍵字修飾一個類的時候,該類不能被繼承。


常量 的修飾符一般為: public static final
常量的命名規(guī)范:全部字母大寫,單詞與單詞 之間 使用下劃線分隔。
比如 ```public static final double CIRCLE_PI = 3.14;```

- 抽象類:
>抽象類的應(yīng)用場景:
    我們在描述一類事物的時候,發(fā)現(xiàn)該種事物確實存在著某種行為,
但是這種行為目前是不具體的,那么我們可以抽取這種行為 的聲明,但是
不去實現(xiàn)該種行為,這時候這種行為我們稱作為抽象的行為,我們就需要使用抽象類。

抽象類的好處: 強(qiáng)制要求子類一定要實現(xiàn)指定的方法。


抽象類要注意的細(xì)節(jié):
    1. 如果一個函數(shù)沒有方法體,那么該函數(shù)必須要使用abstract修飾,把該函數(shù)修飾成抽象 的函數(shù)。。
    2. 如果一個類出現(xiàn)了抽象的函數(shù),那么該類也必須 使用abstract修飾。
    3. 如果一個非抽象類繼承了抽象類,那么必須要把抽象類的所有抽象方法全部實現(xiàn)。
    4. 抽象類可以存在非抽象方法,也可以存在抽象的方法.
    5. 抽象類可以不存在抽象方法的。 
    5. 抽象類是不能創(chuàng)建對象的。
        疑問:為什么抽象類不能創(chuàng)建對象呢?
        因為抽象類是存在抽象方法的,如果能讓抽象類創(chuàng)建對象的話,那么使用抽象的對象
        調(diào)用抽象方法是沒有任何意義的。
    6. 抽象類是存在構(gòu)造函數(shù)的,其構(gòu)造函數(shù)是提供給子類創(chuàng)建對象的時候初始化父類的屬性的。

abstract不能與以下關(guān)鍵字共同修飾一個方法:
    1. abstract不能與private共同修飾一個方法。
    2. abstract 不能與static共同修飾一個方法。
    3. abstract 不能與final共同修飾一個方法。

值傳遞: 調(diào)用一個方法的時候,傳遞給方法的參數(shù) ,實際上傳遞變量所存儲的值。

- 接口:

>接口:接口是抽象方法和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類只包含常量和方法的定義,而沒有變量和方法的實現(xiàn)。
接口的出現(xiàn)將”多繼承“通過另一種形式體現(xiàn)出來,即”多實現(xiàn)“。

接口的定義格式:
interface 接口名{

}
接口要注意的事項 :
    1. 接口是一個特殊的類。
    2. 接口的成員變量默認(rèn)的修飾符為: public static final 。那么也就是說接口中的成員變量都是常量。
    3. 接口中 的方法都是抽象的方法,默認(rèn)的修飾符為: public abstract。
    4. 接口不能創(chuàng)建對象。
    5. 接口是沒有構(gòu)造方法的。
    6. 接口是給類去實現(xiàn)使用的,非抽象類實現(xiàn)一個接口的時候,必須要把接口中所有方法全部實現(xiàn)。


實現(xiàn)接口的格式:
class  類名 implements 接口名{

}
接口的成員特點:

接口中的成員修飾符是固定的!

成員常量:public static final,接口里定義的變量是全局常量,而且修飾符只能是這三個關(guān)鍵字,都可以省略,常量名要大寫。
成員方法:public abstract,接口里定義的方法都是抽象的,兩個修飾符關(guān)鍵字可省略。
推薦:永遠(yuǎn)手動給出修飾符。

類與接口之間關(guān)系: 實現(xiàn)關(guān)系。

類與接口要注意的事項:
    1. 非抽象類實現(xiàn)一個接口時,必須要把接口中所有方法全部實現(xiàn)。
    2. 抽象類實現(xiàn)一個接口時,可以實現(xiàn)也可以不實現(xiàn)接口中的 方法。
    3. 一個類可以實現(xiàn)多個接口 。
        
接口與接口之間關(guān)系: 繼承關(guān)系。

接口與接口之間要注意事項:
一個接口是可以繼承多個接口的。比如, 以下Demo接口繼承了Print和Demo1接口

interface Demo extends Print, Demo1 {

}
interface Demo1 {

}

interface Print extends Eraser {

public abstract void println();

}

interface Eraser {

public static final double money = 1.0;

public abstract void remove(); /// 橡皮擦的功能

}


接口的思想特點:

接口是對外暴露的規(guī)則;
接口是程序的功能擴(kuò)展;
接口的出現(xiàn)降低耦合性;(實現(xiàn)了模塊化開發(fā),定義好規(guī)則,每個人實現(xiàn)自己的模塊,大大提高了開發(fā)效率)
接口可以用來多實現(xiàn);
多個無關(guān)的類可以實現(xiàn)同一個接口;
一個類可以實現(xiàn)多個相互直接沒有關(guān)系的接口;
與繼承關(guān)系類似,接口與實現(xiàn)類之間存在多態(tài)性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容