黑馬程序員-Java語言基礎 –面向對象 第7天

---------------------- android培訓java培訓、期待與您交流! ----------------------


繼承

1、繼承的概述(關係中的一種)

①多個類中存在相同屬性和行爲時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行爲,只要繼那個類即可。

②多個類可以稱爲子類,單獨這個類稱爲父類或者超類。

③子類可以直接訪問父類中的非私有的屬性和行爲。

④通過 extends關鍵字讓類與類之間產生繼承關係。

class SubDemo extends Demo{}

⑤繼承的出現提高了代碼的複用性。

⑥繼承的出現讓類與類之間產生了關係,提供了多態的前提。

注意:千萬不要爲了獲取其他類的功能,簡化代碼而繼承。

必須是類與類之間有所屬關係纔可以繼承。所屬關係是 is a.誰是誰中的一種。誰是誰……

 

2、繼承的特點

      Java只支持單繼承,不支持多繼承。因爲多繼承容易帶來安全隱患:當多個父類中定義了相同功能,而功能內容不要時,不確定要運行哪一個

但是Java保留了這種機制。並用另一種體現形式來完成表示:多實現。接口。

Java支持多層繼承,也就是一個繼承體系。

想要使用體系,先查閱體系父類的描述,因爲父類中定義的是該體系中共性的功能,

通過了解共性的功能,就可以知道該體系的基本功能。

那麼這個體系就基本可以使用咯。

那麼在具體使用時,要創建最子類的對象。

爲什麼呢?

1、因爲父類可能不能創建對象(比如抽象類)。

2、創建子類對象可以使用更多的功能,包括基本的,也包括特有的。

簡單一句話,就是:查閱父類功能,創建子類對象使用功能。

 

·一個類只能有一個父類,不可以有多個父類。(一個孩子只能有一個父親。)

·classSubDemo extends Demo{} //ok

·classSubDemo extends Demo1,Demo2...// error

Java支持多層繼承(繼承體系)。(查閱父類功能,創建子類對象使用功能)

·classA{}

·classB extends A{}

·classC extends B{}

定義繼承需要注意:

·不要僅爲了獲取其他類中某個功能而去繼承。

·類與類之間要有所屬(is a)關係,xx1 是xx2 的一種。

 

聚集:has a  誰裏面有誰。

à聚合:(球員和球隊)

à組合:

 

3、子父類出現後,類中成員的特點。

 

類中成員:1、變量;2、函數;3、構造函數。

3、1變量

如果子類中出現非私有的同名成員變量時。子類要訪問本類中的變量,用this

子類要訪問父類中的同名變量,要用super。

Super 關鍵字

super的使用和this的使用幾乎一樣

this代表的是本類對象的引用

super代表的是父類對象的引用

子類要調用父類構造函數時,可以使用super語句。

 

3、2子父類中的函數

當子類出現和父類一模一樣的函數時。

當子類對象調用該函數,會運行子類函數的內容。

如同父類的函數被覆蓋一樣。

這種情況是函數的另一個特性:重寫(覆蓋)

      當子類繼承了父類,沿襲了父類的功能到子類中,但是子類雖具備該功能,但是功能的內容卻和父類不一致。這是,沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義,並重寫功能內容。

 

函數覆蓋(Override)

子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱爲重寫、複寫或覆蓋。

父類中的私有方法不可以被覆蓋。

在子類覆蓋方法中,繼續使用被覆蓋的方法可以通過super.函數名獲取。

 

覆蓋注意事項:

1、子類覆蓋父類時,必須保證子類方法權限一定要大於等於父類方法權限,纔可以覆蓋。否則編譯失敗。

2、靜態只能覆蓋靜態。

 

覆蓋的應用:

當子類需要父類的功能,而功能主體子類有自己特有內容時,可以複寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。

 

重載與重寫

重載:只看同名函數的參數列表。

重寫:子父類方法要一模一樣。

3、3子類中的構造函數(子類中的構造函數特點-子類實例化過程 [day07-06])

在對子類對象進行初始化時,父類的構造函數也會運行。

那是因爲子類的構造函數默認第一行有一條隱式的語句 super();

super();會訪問父類中空參數的構造函數,而且子類中所有的構造函數,默認第一行都有super();訪問的都是空參數的那個構造函數(父類中多個構造函數時,訪問空參數的)。

 

 

爲什麼子類一定要訪問父類中的構造函數?

      因爲父類中的數據,子類可以直接獲取,所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。所以子類在對象初始化時,要先訪問一下父類中的構造函數。

如果要訪問父類中指定的構造函數,可以通過手動定義super語句的方式來指定。

 

注意:

      1、super語句一定要定義在子類構造函數的第一行。

      2、子類的構造函數第一行也可以手動置頂this語句來訪問本類中的構造函數。

      3、子類中至少會有一個構造函數會訪問父類中的構造函數。

     

結論:(子類的實例化過程)

      子類的所有的構造函數,默認都會訪問父類中空參數的構造函數。

      因爲子類每一個構造函數內的第一行都有一句隱式的super();

      當父類中沒有空參數的構造函數時,子類的構造函數必須通過super語句指定要訪問的構造函數。

      當然:子類的構造函數第一行也可以手動置頂this語句來訪問本類中的構造函數。子類中至少會有一個構造函數會訪問父類中的構造函數。

(this和super不能同時存在,因爲都必須放在第一行。)

 

4、final(最終)關鍵字[day07-07]

      作爲一個修飾符,修飾函數,變量。

1、final可以修飾類,方法、函數,變量。

2、final修飾的類不可以被繼承。爲了避免被繼承,被子類複寫功能。

3、final修飾的方法不可以被覆蓋。

4、final修飾的變量是一個常量,只能被賦值一次。既可以修飾成員變量,也可以修飾局部變量。

      當在描述事物時,一些數據的出現值是固定的,那麼這是爲了增強閱讀性,都給這些值起個名字,方便於閱讀。而這個值不需要改變,所以加上final修飾。作爲常量:常量的書寫規範所有字母都大寫,如果由多個單詞組成,單詞間通過_連接。(常量書寫規範:字母全大寫,單詞間用_相連接,如:XXX_YYY_ZZZ)

public static final double PI = 3.14;(權限夠大的共享數據常量)

 

5、內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。

 

5、抽象類

      當多個類中出現相同功能,但是功能主體不同,這時可以進行向上抽取。這時,只抽取功能定義,而不抽取功能主體。

 

抽象:abstract,看不懂。只修飾類和方法。

 

抽象類的特點:

1、抽象方法一定定義在抽象類中。

2、抽象方法和抽象類都必須被abstract關鍵字修飾。

3、抽象類不可以用new創建對象。因爲調用抽象方法沒有意義。抽象無法實例化

4、抽象類中的抽象方法要被使用,必須由子類複寫其所有的抽象方法後,建立子類對象進行調用。如果子類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。

 

抽象類概述

抽象定義:(看不懂)

抽象就是從多個事物中將共性的,本質的內容抽取出來。

例如:狼和狗共性都是犬科,犬科就是抽象出來的概念。

抽象類:

Java中可以定義沒有方法體的方法,該方法的具體實現由子類完成,該方法稱爲抽象方法,包含抽象方法的類就是抽象類。

 

抽象方法的由來:

多個對象都具備相同的功能,但是功能具體內容有所不同,那麼在抽取過程中,只抽取了功能定義,並未抽取功能主體,那麼只有功能聲明,沒有功能主體的方法稱爲抽象方法。

例如:狼和狗都有吼叫的方法,可是吼叫內容是不一樣的。所以抽象出來的犬科雖然有吼叫功能,但是並不明確吼叫的細節。

 

抽象類的特點

·抽象類和抽象方法必須用abstract關鍵字來修飾。

·抽象方法只有方法聲明,沒有方法體,定義在抽象類中。

·格式:

修飾符 abstract返回值類型 函數名(參數列表);

·抽象類不可以被實例化,也就是不可以用new創建對象。原因如下:

·抽象類是具體事物抽取出來的,本身是不具體的,沒有對應的實

例如:犬科是一個抽象的概念,真正存在的是狼和狗。

·而且抽象類即使創建了對象,調用抽象方法也沒有意義。

·抽象類通過其子類實例化,而子類需要覆蓋掉抽象類中所有的抽象方法後纔可以創建對象,否則該子類也是抽象類。

 

注意:抽象類與一般類沒什麼大的區別,該怎麼描述事物還怎麼描述事物,只不過該事物出現了一些看不懂的東西,這些不確定的部分也是該事物的功能,需要明確出現,但無法定義主體,所以通過抽象的方法來表示。

抽象類比一般類多了個抽象方法,就是類中可以定義抽象方法,抽象類不可以實例化。

 

特殊:抽象類中可以不定義抽象方法。這樣做僅僅是不讓該類建立對象。

 

模版方式設計模式。

 

什麼是模版方法呢?

在定義功能時,功能的一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分。那麼這時,就將不確定的部分暴露出去,由該類的子類去完成。

提高拓展性及複用性。

 

抽象類是有構造函數的:

1、有參:子類繼承後要寫一個構造函數調用父類的構造函數。

2、無參:Java自動調用。

 

abstract不可以和哪些關鍵字共存?

1、final:被final修飾的類不能被繼承,而被abstract修飾的類一定是一個父類。

2、private:私有方法不可被複寫(因爲不爲子類所知,無從複寫),而抽象方法必須被子類複寫才能使用。

3、static:被static修飾的方法可被類名直接調用,但抽象方法運行沒意義。

 

 

6、 接口 (interface)

 

初期理解:可以認爲是一個特殊的抽象類。

      當抽象類中的方法都是抽象的,那麼該類可以通過接口的形式表示。接口的出現將“多繼承”通過另一種形式體現出來,即“多實現”。

class用於定義類

interface用於定義接口

                                    

接口定義時,格式特點;

1、接口中常見定義:常量,抽象方法。

2、接口中的成員都有固定修飾符。(自動添加相應修飾符)

常量:public static final //全局靜態常量

方法:public abstract

記住:接口中的成員都是public

public static final int NUM =3;//int NUM=3;                                                        

public abstract void show();//void show();

 

接口:是不可以創建對象的。因爲有抽象方法。需要被子類實現,子類對接口中的抽象方法全部都覆蓋後,子類纔可以實例化。否則子類是一個抽象類。(覆蓋後的方法必須是public)

 

 

·格式:interface{}

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

·成員常量:public static final

·成員函數:public abstract

(接口中成員都是public的。)

 

接口的特點

l  接口是對外暴露的規則

l  接口是程序的功能擴展

l  接口的出現降低耦合性

l  接口可以用來多實現

l  類與接口之間是實現關係,而且類可以繼承一個類的同時實現多個接口。

l  接口與接口之間可以有繼承關係。·(接口支持多繼承)

 

接口可以被類多實現,也是對多繼承不支持的轉換形式,Java支持多實現。多實現後需覆蓋多個方法。多實現是因爲沒有方法主體,由子類自身覆蓋方法實現功能。

 

類與類之間是繼承關係,類與接口之間是實現關係,接口與接口之間是繼承關係,接口之間可以多繼承

 

基本功能定義在類中,擴展功能定義在接口中。

 

接口與抽象類

共  性:

都是不斷抽取出來的抽象的概念

區別 1:

抽象類體現繼承關係,一個類只能單繼承

接口體現實現關係,一個類可以多實現

區別 2:

抽象類是繼承,是 "is a "關係

接口是實現,是 "like a"關係

區別 3:

抽象類中可以定義非抽象方法,供子類直接使用

接口的方法都是抽象,接口中的成員都有固定修飾符

 




---------------------- android培訓java培訓、期待與您交流! ----------------------

詳細請查看:http://edu.csdn.net/heima




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章