黑馬程序員-Java基礎-面向對象—多態、Object類、內部類、異常

第一講  多態java

一、  定義函數

能夠理解爲事物存在的多種體現形態。學習

在java中,當函數的功能內容不肯定時,能夠將此方法定義爲抽象方法,讓其子類去實現。當子類對象不一樣時,調用同一個函數名,會執行不一樣的函數體,獲得不一樣的結果,從而體現了多態性。this

二、  多態的體現形式spa

  • 父類的引用指向了本身的子類對象:Fu f = new Zi();
  • 父類的引用也能夠接受本身的子類對象;

                      

三、  多態的前提條件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中的語句不會執行。

相關文章
相關標籤/搜索