注意:千萬不要為了獲取其他類的功能而去繼承,簡化代碼而繼承。必須是類與類之間有所屬關(guān)系才可以繼承,所屬關(guān)系 is a 。
Java語言中:Java只支持單繼承,不支持多繼承。因為多繼承容易帶來安全隱患。但多個父類定義了相同的功能時,當(dāng)功能內(nèi)容不同時,子類對象不確定實現(xiàn)哪一個。
但是Java保留這種機制,并用類一種體現(xiàn)形式來完成表現(xiàn),多實現(xiàn)。Java支持多層繼承。也就是一個繼承體系。
如何使用一個體系中的功能呢?想要使用體系,先查閱體系父類的描述,因為父類中定義的是體系中最共性的功能,通過了解共性功能,就可以知道該體系的基本功能。那么這個體系已經(jīng)基本可以使用了。
那么在具體調(diào)用時,要創(chuàng)建最子類的對象,為什么呢?一是因為有可能父類不能創(chuàng)建對象,二是因為創(chuàng)建子類對象可以獲取更多功能,包括基本的也包括特有的。
簡單一句話:查閱父類功能,創(chuàng)建子類對象,使用功能。
4.2繼承的特點子父類出現(xiàn)后:類成員的特點
1、子父類中的變量:如果子父類中出現(xiàn)非私有的同名成員變量時,子類要訪問本類的變量,用this;子類要訪問父類中的同名變量時,用super。
super的使用和this的使用幾乎一致。this代表的是本類對象的引用,super代表的是父類的引用。
4.4函數(shù)覆蓋2、子父類中的函數(shù):當(dāng)子類出現(xiàn)和父類一模一樣的函數(shù)時,當(dāng)子類對象調(diào)用該函數(shù),會運行子類函數(shù)的內(nèi)容。如同父類的函數(shù)被覆蓋和一樣。這種情況是函數(shù)的另一個特性:重寫(覆蓋)
當(dāng)子類繼承父類,沿襲了父類的功能到子類中,但是子類雖然具備該功能,但是功能內(nèi)部的內(nèi)容卻不一致,這是沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義,并重寫功能的內(nèi)容。
覆蓋:1、子類覆蓋父類,必須保證子類權(quán)限大于等于父類權(quán)限,才可以覆蓋,否則編譯失敗。2、靜態(tài)只能覆蓋靜態(tài)。
注意:重載:只看同名函數(shù)的參數(shù)列表。重寫:子父類方法要一模一樣。包括返回值類型。
4.5子類的實例化過程3、子父類中的構(gòu)造函數(shù):在對子類對象進行初始化時,父類的構(gòu)造函數(shù)也會運行,那是因為子類的構(gòu)造函數(shù)默認第一行有一條隱式的語句super();
super();會訪問父類中空參數(shù)的構(gòu)造函數(shù),而且子類中所有的構(gòu)造函數(shù)默認第一行都是super();
為什么子類一定要訪問父類中的構(gòu)造函數(shù)?因為父類中的數(shù)據(jù)子類可以直接獲取,所以子類對象在建立時,需要先查看父類中對這些數(shù)據(jù)是如何進行初始化的。所以子類在對象初始化時,要先訪問一下父類中的構(gòu)造函數(shù)。如果要訪問父類中指定的構(gòu)造函數(shù),可以通過手動定義super語句的方式來指定。
注意:super 語句一定定義在子類構(gòu)造函數(shù)的第一行。
結(jié)論:子類中所有的構(gòu)造函數(shù),默認都會訪問父類中空參數(shù)的構(gòu)造函數(shù)。因為子類每一個構(gòu)造函數(shù)內(nèi)都有一條隱式的語句super();,當(dāng)父類中沒有空參數(shù)的構(gòu)造函數(shù)時,子類必須手動通過super語句形式來指定要訪問父類中的構(gòu)造函數(shù)。當(dāng)然:子類的構(gòu)造函數(shù)第一行也可以手動指定this語句來訪問本類中的構(gòu)造函數(shù)。子類中最少有一個構(gòu)造函數(shù)會訪問父類中的構(gòu)造函數(shù),在子類構(gòu)造函數(shù)中this語句和super語句只能存在一個
4.6final關(guān)鍵字當(dāng)多個類中出現(xiàn)相同功能,但是功能主體不同,可以進行向上抽取。這時只抽取功能定義,而不抽取功能主體。抽象:看不懂。
抽象類的特點:
抽象類和一般類沒有太大的不同。該如何描述事物,就如何描述事物。只不過該事物出現(xiàn)了一些看不懂的東西。這些不確定的部分,也是該事物的功能,也需明確出現(xiàn)。但是無法定義功能主體。通過抽象方法來體現(xiàn)。
抽象類比一般類多了抽象方法。抽象不可以實例化。特殊:抽象類可以不定義抽象方法(目的:不讓該類建立對象)。
模板方法模式:在定義功能時,功能的一部分是確定的(不想被子類復(fù)寫用final修飾),但是有一部分是不確定的(當(dāng)事物有默認的實現(xiàn)時,不一定用abstract修飾)。而確定的部分在使用不確定的部分,那么這時就將不確定的部分暴露出去,由該類的子類去完成。
4.8 接口4.8.1接口的表現(xiàn)形式與類的關(guān)系接口:是不可以創(chuàng)建對象的,因為有抽象方法。需要被子類實現(xiàn),子類對接口中的抽象方法全部覆蓋后,子類才可以實例化。否則子類也是一個抽象類。接口可以被類多實現(xiàn),也是對多繼承不支持的轉(zhuǎn)換形式。Java支持多實現(xiàn)。
一個類繼承了另一個類的同時還能實現(xiàn)多個接口。接口與接口之間存在多繼承,類與類之間只支持單繼承,類與接口之間存在多實現(xiàn)。
4.8.2接口的特點
|
新聞熱點
疑難解答