——Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! ——
1.繼承的概念
面向對象的特點之一,可以實現對類的複用。可以通過以下兩種方法實現
a.合成/聚合關係(包含其他類):將一個類當作另一個類的屬性。
b.派生類:一個類繼承另一個類,實現繼承的類稱爲派生類,被繼承類稱爲父類,基類,超類。
父類的成員方法和成員變量被子類繼承,但是父類的構造方法沒有被繼承。
在Java中只支持單繼承,和C++多繼承不一樣。
2.super關鍵字
1.super可以訪問父類的成員變量
2.super可以調用父類的成員方法
3.super可以在子類構造方法裏調用父類的構造方法
注意:super只能在成員方法和構造方法裏使用,不能在static方法裏使用(和this一樣),
在構造方法中使用必須放在第一行。
3.this和super關鍵字比較(都不能在static方法中調用)
4.方法覆蓋
方法覆蓋只存在子類和父類之間
子類覆蓋父類的方法時,訪問權限不能縮小,可以擴大,其他寫法一樣
父類的靜態方法不能被子類覆蓋爲非靜態方法
5.訪問權限
類的訪問修飾符
public:任何包中的類(即一切的類)都可以訪問該類
默認值:同一包中的類可以訪問該類
成員的訪問修飾符
private:只對本類可見,對子類不可見
默認值:對同一包中的類可見
protected:對同一包中的類和所有子類可見
public:對一切類可見
注意:訪問成員的前提是首選能訪問成員所在的類
6.重寫和重載的比較
7.對象的多態性
多態是指引用類型在不同情況下的多種形態,也可以理解爲通過指向父類的指針調用不同子類中覆蓋的方法
一個基類的引用類型變量可以"指向"其子類的對象。
一個基類的引用不可以訪問其子類中新增加的成員(屬性和方法)。
instanceof : 對象 instanceof 類名/接口 //判斷該對象是否是該類/該類的子類/實現該接口。
子類對象可以當作父類對象來使用稱爲向上轉型,反之稱爲向下轉型。
8.抽象類和抽象方法(abstract)
抽象類(abstract修飾):任何聲明爲abstract的抽象類無法實例化,除非其子類全部覆蓋其抽象方法,
這樣子類就不是抽象類,不一定要包含抽象方法,但是有抽象方法的類必須聲明爲抽象類。
抽象方法(abstract修飾):沒有方法體的成員方法。不可以用abstract修飾構造方法。
抽象類的子類:1.抽象父類有抽象方法:
a.非抽象的子類:子類覆蓋重寫父類所有的抽象方法
b.抽象的子類:父類中的抽象方法只要有一個沒有覆蓋重寫而繼承了必須聲明爲abstract類
2.抽象父類沒有抽象方法:
a.非抽象的子類:不用abstract修飾子類且不添加抽象方法即可(此時可以實例化)
b.抽象的子類:可以用abstract修飾,或者添加抽象方法再聲明爲抽象類。
注意:抽象方法被可視化的修飾符修飾的只有兩個即public ,protected,即除了"默認訪問修飾符"
"public","protected"修飾抽方法,其餘的(private ,static ,final)不可以修飾。
9.abstract,final,static比較
10.接口(interface)
接口:比抽象類還抽象的抽象類,是抽象方法和常量值的定義的集合。沒有變量和方法的實現。
接口常量:默認public static final 屬性(注意:不接受其他修飾符), type name=value;
接口方法:默認public abstract 屬性(注意:不接受其他修飾符),returnType methodName (paramlist)
接口的實現類(implements):實現接口的類必須覆蓋所有接口的方法,否則成爲抽象類。可實現多個接口
接口的好處:
解決了Java的單一繼承帶來的侷限性,也解決了C++多重繼承帶來的問題,
多重繼承的危險會導致子類繼承同一方法的不同實現。而接口裏的方法都沒有實現,所以多重繼承的問題。
通過接口實現不相關類的相同行爲,而無需考慮這些類之間的關係。
通過接口瞭解對象的交互界面,而無需瞭解對象所對應的類
11.抽象類和接口的比較
12.多態性
封裝是爲了保護屬性的操作,繼承是爲了擴展類的功能
多態是由封裝性和繼承性引出面向對象程序設計語言的另一個特徵。
多態的體現:方法的重載和重寫
1.1 靜態多態性(編譯時多態):由方法重載(overload)實現
1.2 動態多態性(運行時多態):子類對象可以作爲父類對象使用,有方法重寫(overridder)實現
13.對象的多態性
對象的多態性主要分爲兩種:
1.向上轉型:
父類 父類對象=子類實例;//程序自動完成
注意使用規則:
操作的是父類對象,所以無法訪問子類新增加的成員(屬性和方法)。
子類中覆蓋的方法和同名的成員變量
a.成員變量(包括靜態的變量)和靜態成員方法:編譯和運行都看左邊(看父類的)
b.非靜態的成員方法:編譯看左邊的,運行看右邊的(子類覆蓋的方法)。
2.向下轉型:
子類 子類對象=(子類)父類對象;//需要強制轉換
14.內部類(等價於一個非靜態的成員方法即不可聲明static變量)
在類的內部裏再定義另外一個類,則這個類稱爲內部類。
外部類的成員被內部類所知,而內部類的成員不被外部所知,只能實例化內部類來訪問其成員
優點:可以方便的訪問外部類的私有屬性(最大優點),減少編譯後字節碼文件的大小
缺點:使程序結構不清晰。
14.1 成員內部類(即實例內部類)
成員內部類中不能定義static變量
成員內部類持有外部類的引用
文件管理方面:編譯後會產生“外部類名$內部類名.class”的文件
外部實例化類的格式:
Outer out=new Outer(); Outer.Inner in=out.new Inner();
14.2 靜態內部類(外部類)
用static聲明的內部類,稱爲靜態內部類,相當於外部類。可以通過外部類.內部類來訪問
靜態內部類不會持有外部類的引用。創建時可以不用創建外部類。
靜態內部類可以訪問外部的靜態變量,如果要訪問外部類的成員變量必須通過實例化外部類訪問
外部實例化類的格式
Outer.Inner in=new Outer.Inner();
14.3 局部內部類(在方法中定義的內部類)
可以訪問外部類的成員,要想訪問方法中局部變量必須爲final類型纔可以訪問
局部內部類不能加private ,protected,public中任一個修飾符
不能包含靜態成員。
14.4 匿名內部類
如果一個內部類在整個操作中只使用一次的話,可以定義爲匿名內部類
沒有名字的內部類,這是Java爲了方便我們編寫程序而設計的一個機制。有時候有的內部類
只需要創建一個對象即可,以後再也不會用到這個類了。
匿名內部類是在抽象類和接口的基礎上發展起來的。它可以是繼承某個類,或是實現某個接口
在文件管理上:編譯後會產生“外部類名$編號.class”,編號爲1,2,3....n,表示第幾個匿名內部類
格式:
new 父類或者抽象父類或者接口名()
{ 實現方法}.調用相應的方法;
總結:
多態:非靜態方法-編譯時看左邊,運行時看右邊。靜態方法和成員變量-都看左邊
(非靜態)內部類:相當於一個非靜態的方法,不能在裏面定義靜態變量,且內部類默認持有外部類的引用。
(靜態)內部類:相當於外部類,不持有外部類的引用。
靜態代碼塊->構造代碼塊->構造方法