------- android教育訓練、java教育訓練、期待與您交流! ----------
六、内部類
(一)内部類
内部類:将一個類定義在另一個類裡面,這個類就稱為内部類
内部類的通路規則:
1、内部類可以直接通路外部類中的成員,包括私有。
2、外部類要通路内部類,必須建立内部類對象。(如:外面要通路内部類時:Outer.Inner in=new Outer().new.Inner();),如果有相同的變量,要想通路外部類的成員變量,需要加上外部類名.this.變量。通路格式:
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修飾的局部變量。
參考下例:
1、匿名内部類其實就是内部類的簡寫格式。
2、定義匿名内部類的前提:内部類必須是繼承一個類或者實作接口。
3、匿名内部類的格式:new父類或者接口(){定義子類的内容}.方法。
4、其實匿名内部類就是一個匿名子類對象,而且這個對象有點胖;可以了解為帶内容的對象。
5、匿名内部類中定義的方法最好不要超過3個。
七、異常
異常:就是程式在運作時出現不正常情況。
異常由來:問題也是現實生活中一個具體的事物,也可以通過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所描述并封裝對象,是以對于這些特有的問題可以按照java的對問題封裝的思想,将特有的問題進行自定義封裝。
當在函數内部出現了throw抛出異常對象,那麼就必須要給對應的處理動作,要麼在内部try、catch處理,要麼在函數上聲明讓調用者處理;一般情況下,函數内部出現異常,函數上需要聲明。
如何定義異常資訊呢?
因為父類中已經把異常資訊的操作都完成了,是以子類隻要在構造時,将異常資訊傳遞給父類通過super語句,那麼就可以直接通過getMessage方法擷取自定義的異常資訊了。
自定義異常:必須是自定義類繼承Exception或RuntimeException。
繼承Exception原因:異常體系有一個特點,因為異常類和異常對象都被抛出,他們都具備可抛性,這個可抛性Throwable這個體系中的獨有特點,隻有這個體系中的類和對象才可以被throws和throw操作。
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