第一講 多態java
一、 定義函數
能夠理解爲事物存在的多種體現形態。學習
在java中,當函數的功能內容不肯定時,能夠將此方法定義爲抽象方法,讓其子類去實現。當子類對象不一樣時,調用同一個函數名,會執行不一樣的函數體,獲得不一樣的結果,從而體現了多態性。this
二、 多態的體現形式spa
三、 多態的前提條件3d
四、 多態的好處對象
大大的提升了程序的擴展性。——當子類對象增長時,儘量的少該代碼。blog
五、 多態缺陷繼承
提升了擴展性,但只能使用父類的引用訪問父類中的成員。父類的引用不能訪問子類中的成員。接口
以下,父類的引用an1訪問了子類特有方法kanjia();
六、 子父類類型轉換
Fu f = new Zi();————類型自動提高,向上轉型,將子類型轉成父類型。
Zi z = (Cat) f ; ————強制將父類的引用轉成子類類型,向下轉型。
注意:不能將父類型對象轉成子類型。
七、 多態的應用
創建兩個類:基礎班學生 和 高級班學生,都有學習、睡覺功能。要求將這兩類事物進行抽取。
八、 多態的出現,代碼中的特色——多態使用的注意事項
1) 多態中非靜態成員函數的特色
編譯時期:參閱引用類型變量所屬的類中是否有調用的方法,如有,編譯經過,不然編譯失敗。由於:編譯時,對象還沒被建立,父 類和子類尚未創建關係。
運行時期:參閱對象所屬的類中是否有調用的方法,如有,則執行對象所屬類中的功能,不然,執行父類中的功能。
總結:成員函數在多態調用時,編譯看左邊(引用類型),運行看右邊(對象所屬的類)。
2) 多態中成員變量的特色
不管編譯仍是運行,都參考左邊(引用型變量所屬的類。若是引用型變量所屬的類中沒有此成員變量,則編譯失敗。運行時,也會調用引用型變量所屬類中的變量。
在多態中訪問子類變量方法:當須要訪問子類中的成員變量時,能夠用強制類型轉換,將父類型的引用強制轉換成子類型:zi x = (zi)y,其中y表明指向子類型的父類型的應用變量
3) 多態中,靜態成員函數的特色
不管編譯仍是運行,都參考左邊(引用型變量所屬的類)。
緣由:非靜態方法和靜態在內存中存儲的位置不一樣,非靜態方法區中有兩個引用(this和super),而靜態方法區中只有類名引用.
第二講 Object類
一、 概念
Object是全部對象的直接或間接父類。該類中定義的確定是多有對象都具有的功能。
二、 Object類應用
Object類中已經提供了對對象是否相同的比較方法equals(),若是自定義類中也有比較相同的功能,沒有必要從新定義,只要沿襲父類中的功能,創建本身特有的比較內容便可——這就是覆蓋。
第三講 內部類
一、 定義
二、 訪問規則
1) 內部類能夠直接訪問外部類中的成員,包括私有的,由於此時,內部類處於成員位置上,能夠任務是外部類中的一個成員,內部類中持有了一個外部類的引用,格式:Outer.this.x——這裏的this表明的是內部類對象。這就是內部類可以直接訪問外部類成員的緣由。
2) 外部類要訪問內部類,就必須創建內部對象:
Inner inner = new Inner();
3) 其餘外部類訪問內部類的方式
當內部類定義爲非私有,能夠在外部其餘類中直接創建內部類對象進行訪問,格式以下:
Outer.Inner inner = new Outer().new Inner();
當內部類在成員位置上時,能夠被成員修飾符鎖修飾
如,private修飾:將內部類在外部類進行封裝,只能外部類訪問;
Static 修飾:內部類就具有了static的特性。此時,內部類只能訪問外部類中的static成員,出現了訪問侷限。
外部其餘類訪問static修飾的內部類非靜態成員方法以下:
————new Outer.Inner().function();——Inner類是Outer類的靜態成員,能夠直接用類名調用。
外部其餘類直接訪問static修飾的內部類的靜態成員方法以下:
————Outer.Inner.function();——靜態成員能夠直接被類名調用。
注意:當內部類中定義了靜態成員,該內部類必須是靜態的;當外部類中的靜態方法訪問內部類時,內部類也必須是靜態的。
——一個大原則:靜態只能訪問靜態成員。
內部類在局部位置上時:
不能被static修飾;
能夠訪問外部類中的成員,由於還持有外部類中的引用。可是不能訪問它所在的局部中的變量,只能訪問被final修飾的局部變量。
以下:a 只有被final修飾後,才能被內部類訪問。
以下,內部類被定義在了局部位置上。系統默認給內部類一個外部類的引用Outer.this
總結:無論內部類定義在成員位置仍是局部位置上,外部類須要內部類對象才能訪問內部類中成員,內部類獲得了外部類對象(系統默認提供外部類引用Outer.this)才能訪問外部類成員。
三、 匿名內部類
定義:匿名內部類其實就是內部類的簡寫格式。
定義匿名內部類的前提:內部類必須是繼承一個類或者實現接口。
第四講 異常
一、 定義
異常:程序運行時出現的不正常狀況。
異常由來:問題也是現實生活中的一個具體的事物,也能夠經過java類的形式進行描述,並封裝成對象,即,對不正常狀況進行描述後的對象體現。
異常劃分:嚴重問題 和 非嚴重問題。
嚴重問題:java經過Error類進行描述,對於Error通常不編寫針對性的代碼進行處理。
非嚴重問題:java經過Exception進行描述,可使用針對性的處理方式進行處理。
其中,Error和Exception同爲Throwable的子類。
二、 異常處理
異常處理目的:把異常處理掉,讓try外面的後續語句繼續執行。若不處理,程序就會被停下來,不處理後續語句。
緣由:若是虛擬機調用的程序沒有的處理此項異常的功能,該異常會被拋給虛擬機,而虛擬機處理異常的默認機制是:直接把此程序停掉。
異常處理代碼格式以下:
處理異常有兩種方式:
第一種是:向上(向調用者)拋出異常;
第二種是:本身內部捕獲異常並處理。
三、 多異常處理
1) 函數中只要有異常發生,函數就停下了;
2) 被調用函數聲明瞭幾個異常,調用者就對應有幾個catch塊,若是多個catch塊中的異常出現繼承關係,父類異常catch塊必須放在最下面;
3) 若程序出現了被調用函數所聲明之外的異常,最好將此異常拋給虛擬機,將程序停掉;
4) 建議進行catch處理時,catch中必定要定義具體的處理方式,而不是簡單的打印異常。異常信息能夠輸出到硬盤中相應的文檔中,方便後續異常查找及處理;
四、 自定義異常
能夠自定義java機制中沒有定義的異常。
注意:Java不會自動識別自定義異常,因此,須要手動創建自定義異常對象並拋出(java自己定義的異常能夠被默認拋出)
1) 自定義異常信息
由於父類中已經把異常信息的操做都完成了,因此子類只要在構造時,將異常信息經過super語句傳遞給父類,而後就能夠直接經過 getMessage方法獲取自定義的異常信息了
2) 自定義異常特色
必須繼承Exception。由於:異常體系有一個特色:異常類和異常對象都被拋出,它們都具有可拋性,這是Throwable體系中獨有的特色。只有這個體系中的類和對象才能夠被throws和throw操做。
五、 Throws和throw的區別
1) Throws使用在函數上;Throw使用在函數內;
2) Throws後面跟着異常類,能夠多個,用逗號隔開;Throw後面跟着異常對象;
注意:Throw下面不該跟其餘語句,由於異常拋出後,下面語句不會再執行。Throw和return做爲函數的結束標識。可是系統退出(System.exit(0))時不會執行。
六、 RuntimeException
定義:函數內拋出異常,則函數上必須聲明拋出異常,不然編譯不經過,但RuntimeException不須要函數聲明拋出。若是函數上聲明瞭該異常,調用者能夠不用進行異常處理,編譯也能經過。
RuntimeException不須要在函數上聲明的緣由是:此異常不須要調用者處理。此類異常發生時,但願程序中止,由於在程序運行時出現了沒法繼續運算的狀況,但願中止程序後,對代碼進行修正。
七、 異常覆蓋時的特色
異常在子父類覆蓋中的體現:
1)子類在覆蓋父類時,若是父類的方法拋出異常,那麼子類的覆蓋類方法只能拋出父類的異常或者該異常的子類,或者不拋出異常;
2)若是父類方法拋出多個異常,那麼子類在覆蓋該方法時,只能拋出父類異常的子集;
3)若是父類或者接口的方法中沒有異常拋出,那麼子類在覆蓋方法時,也不能夠拋出異常。若是子類方法發生了異常,就必需要進行try處理,絕對不能拋出。
知識點總結
一、 繼承類和實現接口
父類中定義了某類事物的通用屬性,而接口中每每定義的是某類事物的擴展功能。
二、 Throw 和 throws的用法
1) Throw定義在函數內,用於拋出異常對象;
2) Throws定義在函數上,用於拋出異常類,能夠拋出多個,用逗號隔開;
三、 異常分兩種:編譯時異常 和 運行時異常
1) 編譯時被檢測的異常:函數內被拋出,則函數上必需要聲明,且在調用者中必須處理或向外拋出;
2) 編譯時不被檢測的異常(即,運行時異常,RuntimeException)
函數上不須要聲明,不須要調用者進行處理。
四、 異常處理中finally塊中語句特色
1) finally中定義的一般是:關閉資源代碼。由於資源必須被釋放。
2) finally只有一種狀況不會執行:當執行到System.exit(0);時,finally中的語句不會執行。