天天看點

黑馬程式員—java面向對象總結(4)—内部類、異常

------- android教育訓練、java教育訓練、期待與您交流! ----------

六、内部類

(一)内部類
内部類:将一個類定義在另一個類裡面,這個類就稱為内部類
内部類的通路規則:
1、内部類可以直接通路外部類中的成員,包括私有。
2、外部類要通路内部類,必須建立内部類對象。(如:外面要通路内部類時:Outer.Inner in=new Outer().new.Inner();),如果有相同的變量,要想通路外部類的成員變量,需要加上外部類名.this.變量。
黑馬程式員—java面向對象總結(4)—内部類、異常

通路格式:

1、當内部類定義在外部類的成員位置上,而且非私有,可以在外部其它類中直接建立内部類對象,格式為:外部類名.内部類名 變量名=外部類對象.内部類對象,如:Outer.Inner in=new.Outer().new Inner();

2、當内部類在成員位置上,就可以被成員修飾符所修飾;比如:private将内部類在外部類中進行封裝;static内部類就具備了static特性,當内部類被static修飾後,内部類就隻能直接通路外部類中的static成員,出現了通路局限。

在外部其它類中,如何直接通路static内部類的非靜态成員呢?

可以采用如:new 0uter.Inner().function();

在外部其它類中,如何直接通路static内部類的靜态成員呢?

可以采用如:0uter.Inner.function();

注意:1、當内部類中定義了靜态成員,該内部類必須是static的。

  2、當外部類中的靜态方法通路内部類時,内部類也必須是static的。

内部類什麼時候用?

當描述事物時,事物的内部還有事物,該事物用内部類來描述,因為内部事物在使用外部事物的内容。

内部類定義在局部時:1、不可以被成員修飾符修飾;2、可以直接通路外部類中的成員,因為還持有外部類中的引用,但是不可以通路它所在的局部中的變量,隻能通路被final修飾的局部變量。

參考下例:

黑馬程式員—java面向對象總結(4)—内部類、異常
(二)匿名内部類:

1、匿名内部類其實就是内部類的簡寫格式。

2、定義匿名内部類的前提:内部類必須是繼承一個類或者實作接口。

3、匿名内部類的格式:new父類或者接口(){定義子類的内容}.方法。

4、其實匿名内部類就是一個匿名子類對象,而且這個對象有點胖;可以了解為帶内容的對象。

5、匿名内部類中定義的方法最好不要超過3個。

黑馬程式員—java面向對象總結(4)—内部類、異常

七、異常

異常:就是程式在運作時出現不正常情況。

異常由來:問題也是現實生活中一個具體的事物,也可以通過java的類的形式進行描述,并封裝成對象,其實就是java對不正常情況進行描述後的對象展現。

對于問題的劃分有兩種:一種是嚴重的問題,一種是非嚴重的問題。

對于嚴重的,java通過Error類進行描述;對于Error一般不編寫針對性的代碼對其進行處理。

對于非嚴重的,java通過Exception類進行描述;對于Exception可以使用針對性的處理方式進行處理。

異常體系:

Throwable 

|------Error

|------Exception

|-------RuntimeException
異常的處理:
java提供了特有的語句進行處理,如下:
try{需要被檢測的代碼}
catch(異常類 變量){處理異常的代碼:(處理方式)}
finally{一定會執行的語句},一般用于關閉資源

對捕獲到的異常對象進行常見方法操作;如:(Exception a),a.toString:列印異常說明;a. getMessage:擷取異常資訊。

例子:int div(int a,int b)throws Exception;throws Exception為在功能上通過throws的關鍵字聲明了該功能有可能會出現問題。

對多異常的處理:

1、聲明異常時,建議聲明更為具體的異常,這樣處理得可以更具體;處理方式有兩種:try或者throws。

2、對方聲明幾個異常,就對應有幾個catch塊,不要定義多餘的catch塊;如果多個catch塊中的異常出現繼承關系,父類異常catch塊放在最下面。

3、建立在進行catch處理時,catch中一定要定義具體處理方式,不要簡單定義一句e.pringtStackTrace(),或輸出語句,也不要不寫。當捕獲到的異常,本功能處理不了時,可以繼續在catch中抛出。

try

{

throw new AException();

}

catch(AException  e)

{

throw  e;

}如果該異常處理不了,但并不屬于該功能出現的異常,可以将異常轉換後,再抛出和該功能相關的異常;或者異常可以處理,當需要将異常産生的和本功能相關的問題提供出去,當調用者知道,并處理;也可以将捕獲異常處理後,轉換新的異常。

try

{

throw new AException();

}

catch ( AException  e)

{ //對AException處理。

throw new BException();

}

黑馬程式員—java面向對象總結(4)—内部類、異常

自定義異常:

因為項目中會出現特有的問題,而這些問題并未被java所描述并封裝對象,是以對于這些特有的問題可以按照java的對問題封裝的思想,将特有的問題進行自定義封裝。

當在函數内部出現了throw抛出異常對象,那麼就必須要給對應的處理動作,要麼在内部try、catch處理,要麼在函數上聲明讓調用者處理;一般情況下,函數内部出現異常,函數上需要聲明。

如何定義異常資訊呢?

因為父類中已經把異常資訊的操作都完成了,是以子類隻要在構造時,将異常資訊傳遞給父類通過super語句,那麼就可以直接通過getMessage方法擷取自定義的異常資訊了。

自定義異常:必須是自定義類繼承Exception或RuntimeException。

繼承Exception原因:異常體系有一個特點,因為異常類和異常對象都被抛出,他們都具備可抛性,這個可抛性Throwable這個體系中的獨有特點,隻有這個體系中的類和對象才可以被throws和throw操作。

黑馬程式員—java面向對象總結(4)—内部類、異常
黑馬程式員—java面向對象總結(4)—内部類、異常

throws和throw的差別:throws使用在函數上,throw使用在函數内;throws後面跟的異常類,可以跟多個,用逗号隔開;throw後跟的是異常對象。

Exception中有一個特殊的子類異常RuntimeException運作時異常,如果在函數内容抛出該異常,函數上可以不用聲明,編譯一樣通過,如果在函數上聲明了該異常,調用者可以不用進行處理,編譯一樣通過。

之是以不用在函數聲明,是因為不需要讓調用者處理,當該異常發生時,希望程式終止,因為在運作時,出現了無法繼續運算的情況,希望停止程式後,對代碼進行修正。

自定義異常時,如果該異常的發生無法再繼續運作運算,就讓自定義異常繼承RuntimeException.

對于異常分兩種:1、編譯時被檢測的異常;2、編譯時不被檢測的異常(運作時異常、RuntimeException以及其子類)

異常處理格式:

第一種格式:try{} catch(){}

第二種格式:try{} catch(){} finally{}

第三種格式:try{} finally{}

注意:1、finally中定義的通常是關閉資源代碼,因為資源必須釋放。

2、finally隻有一種情況不會執行,當執行到System.exit(0);finally不會執行。

Catch是用于處理異常,如果沒有catch就代表異常沒有被處理過,如果該異常時檢測時異常,那必須聲明。

異常在子父類覆寫中的展現:

1、子類在覆寫父類時,如果父類的方法抛出異常,那麼子類的覆寫方法,隻能抛出父類的異常或者該異常的子類,不能抛父類中沒有的異常。

2、如果父類方法抛出多個異常,那麼子類在覆寫該方法時,隻能抛出父類異常的子集。

3、如果父類或者接口的方法中沒有異常抛出,那麼子類在覆寫方法時,也不可以抛出異常;如果子類發生了異常,就必須要進行try處理,絕對不能抛。

八、包

包:用package定義,如:package pack;在cdm下運作時建立包用javac -d 目錄 類名.java(-d . 代表目前目錄),運作時用java 包名.類名;包也是一種封裝。

總結:包與包之間進行通路,被通路的包中的類以及類中的成員,需要public修飾;不同包中的子類還可以直接通路父類中被protected權限修飾的成員;包與包之間可以使用的權限隻有兩種:public   protected。

權限大小順序:public>protected>default>private(ok代表可以通路,default代表預設權限)

同一個類中:    ok      ok      ok     ok

同一個包中:    ok      ok      ok

不同包中子類:  ok      ok

不同包中:      ok

為了簡化各包中類名的書寫,使用一個關鍵字import進行導入,*代表包中所有的類;建議,不要寫通配*,需要用到包中的哪個類,就導入那個類。

Java中的壓縮包字尾名為Jar

繼續閱讀