本文主要內(nèi)容
1、繼承 extends
2、抽象 abstract
3、接口 interface
4、多態(tài)
5、instanceof關(guān)鍵字
01 繼承 extends
A、繼承的格式:class 子類 extends 父類 {}
B、繼承注意事項(xiàng)
1、子類繼承父類后,將直接擁有父類所有非私有的屬性和方法
2、java中類只能單繼承,不能多繼承,但是可以多層繼承(一個(gè)類的父類可以再去繼承另外的父類)。
class A{}
class B{}
class C extends A,B{} // C類不可以同時(shí)繼承A類和B類
3、所有的類都直接或間接繼承了Object類,多個(gè)類可以繼承同一個(gè)父類
class A{}
class B extends A{}
class C extends A{} // 類B和類C都可以繼承類A
4、繼承的缺點(diǎn)是,類與類之間耦合度過高
5、子類、父類中出現(xiàn)同名變量或方法時(shí),訪問子類中的變量或方法時(shí)使用 this關(guān)鍵字,訪問父類中的變量或方法時(shí)使用super關(guān)鍵字
6、子類的對(duì)象調(diào)用成員變量的時(shí)候,子類自己有,使用子類,子類自己沒有調(diào)用的父類
C、重寫override
1、子類重寫(override)父類的方法時(shí),父類的私有方法,子類不能重寫。并且override時(shí)必須要保證子類權(quán)限大于等于父類權(quán)限
2、子類方法和要重寫的父類的方法:方法的方法名和參數(shù)列表都要一樣
3、關(guān)于方法的返回值:
如果是基本數(shù)據(jù)類型,子類的方法和重寫的父類的方法返回值類型必須相同
如果是引用數(shù)據(jù)類型,子類的方法和重寫的父類的方法返回值類型可以相同或者子類方法的返回值類型是父類方法返回值類型的子類
02 重載與重寫
重載:與權(quán)限修飾符(public private 默認(rèn))無關(guān)
方法名:重載的兩個(gè)方法的方法名必須相同
形參列表:形參類型的順序不同、形參的個(gè)數(shù)不同、形參的類型不同。三者至少滿足一個(gè)
返回值類型:重載與返回值類型無關(guān)
重寫:
子類方法的權(quán)限修飾符>=父類的方法的權(quán)限
方法名: 子類方法和父類方法必須相同
形參列表: 子類方法和父類方法的形參列表必須相同
返回值類型:
返回基本數(shù)據(jù)類型時(shí),子類的方法和重寫的父類的方法返回值類型必須相同
返回引用數(shù)據(jù)類型,子類的方法和重寫的父類方法返回值類型可以相同或者子類方法的
03 抽象 abstract
A、抽象類、方法定義的格式
abstract class 類名 { }
public abstract 返回值類型 方法名(參數(shù));
B、抽象類的特點(diǎn)
1、抽象類用abstract修飾,抽象方法必須寫在抽象類中
2、抽象類中可以沒有抽象方法,可以定義帶有方法體的方法
3、抽象方法,沒有主體
4、抽象類不能new,只能被繼承,然后子類對(duì)父類的抽象方法進(jìn)行重寫。如果子類不想重寫父類的抽象方法,可以將自己定義為抽象類
5、測(cè)試抽象類,只能通過創(chuàng)建他的子類的對(duì)象,使用子類的對(duì)象調(diào)用方法
6、子類要實(shí)現(xiàn)抽象類中所有的抽象方法,才能創(chuàng)建子類對(duì)象,否則子類還是一個(gè)抽象類
7、abstract不可以和private、static、final一起使用。
8、因?yàn)槌橄笮枰宇愔貙?,如果父類是私有的,子類就無法重寫。
C、抽象類的設(shè)計(jì)思想:保證繼承體系的完整性,面對(duì)共性類型操作會(huì)更簡(jiǎn)單
04 接口 interface
A、接口定義格式
public interface 接口名 {
抽象方法1;
抽象方法2;
抽象方法3;
}
B、接口定義步驟
1、使用interface代替了原來的class,其他步驟與定義類相同
2、接口中的方法均為公共訪問的抽象方法
3、接口中無法定義普通的成員變量
C、接口的特點(diǎn)
1、接口中定義的抽象方法格式為:public abstract 返回值類型 方法名(參數(shù)列表)
方法中,修飾符只能為public,如果不寫,默認(rèn)也是public,修飾符public abstract 可以省略
2、接口中不能定義普通的成員變量。只能定義常量,格式為:public static final 數(shù)據(jù)類型 變量名=值,定義時(shí)可以不寫修飾符public static final
3、接口中常量的使用,可直接使用接口名.常量
D、接口的實(shí)現(xiàn)類
1、類與接口的關(guān)系為實(shí)現(xiàn)關(guān)系,即類實(shí)現(xiàn)接口,使用關(guān)鍵字:implements
2、類實(shí)現(xiàn)接口的格式
class 類 implements 接口 {
重寫接口中方法
}
3、類實(shí)現(xiàn)接口的特點(diǎn)
1)接口的實(shí)現(xiàn),需要重寫接口中的全部抽象方法
2)實(shí)現(xiàn)類中的實(shí)現(xiàn)方法的權(quán)限必須和接口中一致。實(shí)現(xiàn)類中如果沒有寫方法的權(quán)限修飾
符,默認(rèn)為default
3)如果實(shí)現(xiàn)類只實(shí)現(xiàn)了接口中的一部分方法,那么這個(gè)實(shí)現(xiàn)類是一個(gè)抽象類
4)一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,并且不存在安全隱患,因?yàn)榻涌谥械姆椒]有方法體,方法
的實(shí)現(xiàn)要依賴實(shí)現(xiàn)類
5)一個(gè)接口可以繼承多個(gè)接口
E、接口的設(shè)計(jì)思想:暴露規(guī)則,降低耦合,提高擴(kuò)展性
F、接口常見問題
1、java中有多繼承嗎?類中只能單繼承,接口之間可以多繼承
2、一個(gè)類如果實(shí)現(xiàn)類接口,有幾種操作方法?
方法一:實(shí)現(xiàn)類是非抽象類,就需要重寫接口中所有的抽象方法.
方法二:實(shí)現(xiàn)類也聲明為抽象類,那么實(shí)現(xiàn)類可以不重寫接口中的抽象方法。
04 接口和抽象類
A、相同點(diǎn)
1、都不能直接實(shí)例化
2、都包含抽象方法
3、都可以被繼承
B、不同點(diǎn)
1、抽象類是事物中應(yīng)具備的功能,接口是事物中的額外功能
2、一個(gè)類只能繼承一個(gè)抽象類,但是可以實(shí)現(xiàn)多個(gè)接口
3、抽象類中提供非抽象方法的實(shí)現(xiàn),接口只提供抽象方法
4、抽象類是這個(gè)事物中應(yīng)該具備的你內(nèi)容, 繼承體系是一種 is..a關(guān)系
接口是這個(gè)事物中的額外內(nèi)容,繼承體系是一種 like..a關(guān)系
C、二者的選用
1、 優(yōu)先選用接口,盡量少用抽象類;
2、 需要定義子類的行為,又要為子類提供共性功能時(shí)才選用抽象類;
05 多態(tài)
A、多態(tài)調(diào)用的三種格式
對(duì)象的多態(tài)調(diào)用方式: 父類類型或者接口類型 變量 = new 子類的對(duì)象();
1、普通類的繼承可以實(shí)現(xiàn)多態(tài)的引用
2、抽象類的繼承可以實(shí)現(xiàn)多態(tài)的引用
3、接口的實(shí)現(xiàn)可以實(shí)現(xiàn)多態(tài)的引用
B、多態(tài)成員特點(diǎn)
多態(tài)調(diào)用方法時(shí),運(yùn)行的是子類的重寫方法。
1、成員變量:編譯用父類,運(yùn)行用父類
多態(tài)引用時(shí),調(diào)用成員變量時(shí),編譯時(shí)參考父類中是否有該變量,如果有編譯成功,否則失敗。運(yùn)行時(shí)運(yùn)行的是父類中的變量
簡(jiǎn)而言之:編譯和運(yùn)行都參考等號(hào)的左邊。編譯運(yùn)行看左邊。
2、成員方法:編譯用父類,運(yùn)行用子類
多態(tài)引用時(shí),調(diào)用成員方法時(shí),編譯時(shí)參考父類中是否有該方法,如果有編譯成功,否則失敗。運(yùn)行時(shí)運(yùn)行的是子類中的重寫的方法
簡(jiǎn)而言之:編譯看左邊,運(yùn)行看右邊。
總結(jié):
1、多態(tài)調(diào)用時(shí),調(diào)用的是成員變量無論是靜態(tài)還是非靜態(tài),編譯運(yùn)行都是看父類。
2、多態(tài)調(diào)用時(shí),調(diào)用的是靜態(tài)方法,編譯運(yùn)行都是看父類,調(diào)用的是非靜態(tài)方法,編譯看父類運(yùn)行看子類的重寫方法。
C、多態(tài)的轉(zhuǎn)型
1、多態(tài)的轉(zhuǎn)型分為:向上轉(zhuǎn)型與向下轉(zhuǎn)型
2、向上轉(zhuǎn)型:當(dāng)有子類對(duì)象賦值給一個(gè)父類引用時(shí),便是向上轉(zhuǎn)型
使用格式:
父類類型 變量名 = new 子類類型();
如:Person p = new Student();
3、向下轉(zhuǎn)型:一個(gè)已經(jīng)向上轉(zhuǎn)型的子類對(duì)象可以使用強(qiáng)制類型轉(zhuǎn)換的格式,將父類引用轉(zhuǎn)為子類引用
使用格式:
子類類型 變量名 = (子類類型) 父類類型的變量;
如:Student stu = (Student) p; //變量p 實(shí)際上指向Student對(duì)象
4、當(dāng)不需要面對(duì)子類類型時(shí),通過提高擴(kuò)展性,或者使用父類的功能就能完成相應(yīng)的操作,這時(shí)就可以使用向上轉(zhuǎn)型。
當(dāng)要使用子類特有功能時(shí),就需要使用向下轉(zhuǎn)型。在轉(zhuǎn)換之前必須使用instanceof做類型判斷。
06 instanceof關(guān)鍵字
A、類的比較:instanceof關(guān)鍵字,判斷某個(gè)對(duì)象是否屬于某種數(shù)據(jù)類型
B、使用格式: boolean b = 對(duì)象 instanceof 數(shù)據(jù)類型;
舉例:
Person p1 = new Student(); // 前提條件,學(xué)生類已經(jīng)繼承了人類
Person p2 = new Student();
boolean flag = p1 instanceof Student; //flag結(jié)果為true
boolean flag2 = p2 instanceof Teacher; //flag結(jié)果為false
C、instanceof只能用于有實(shí)現(xiàn)關(guān)系的類比較