---------------------- 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語句來訪問本類中的構造函數。
結論:(子類的實例化過程)
子類的所有的構造函數,默認都會訪問父類中空參數的構造函數。
因爲子類每一個構造函數內的第一行都有一句隱式的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