內部類(lèi)(Outer.java)
在一個(gè)類(lèi)中定義另外一個(gè)類(lèi),這個(gè)類(lèi)就叫做內部類(lèi)或內置類(lèi)(inner class)
內部類(lèi)和外部類(lèi)分屬不同的空間,都有自己的數據變量和數據方法,內部類(lèi)仍然是一個(gè)獨立的類(lèi)
內部類(lèi)所產(chǎn)生的字節碼的文件名:外部類(lèi)$內部類(lèi).class
內部類(lèi)可以讓我們將邏輯上相關(guān)的一組類(lèi)組織起來(lái),并由外部類(lèi)(outer class)來(lái)控制內部類(lèi)的可見(jiàn)性
當我們建立一個(gè)inner class時(shí)(不管其嵌套的層次有多深),其對象就擁有了與外部類(lèi)對象之間的一種關(guān)系,這是通過(guò)一個(gè)特殊的this reference形成的,使得內部類(lèi)對象可以隨意的訪(fǎng)問(wèn)外部類(lèi)中所有的成員
在一個(gè)方法內定義一個(gè)類(lèi)的時(shí)候只能在該方法內部使用這個(gè)類(lèi)
還可將內部類(lèi)的定義放置在一個(gè)語(yǔ)句塊中
在方法中定義的內部類(lèi),如果要訪(fǎng)問(wèn)方法中定義的本地變量或方法的參數,則變量必須被聲明為final
內部類(lèi)可以聲明為private或protected,還可以聲明為abstract或final
內部類(lèi)可以聲明為static的,那么在產(chǎn)生內部類(lèi)的對象的時(shí)候就無(wú)需同時(shí)再存在一外部類(lèi)的對象,但此時(shí)就不能再使用外部類(lèi)的非static的成員變量和非static的成員方法
非static的內部類(lèi)中的成員不能聲明為static的,只有在頂層類(lèi)或static的內部類(lèi)中才可聲明static成員
為什么要使用內部類(lèi):
在內部類(lèi)中,可以隨意的訪(fǎng)問(wèn)外部類(lèi)的成員,這可以讓我們更好地組織管理我們的代碼,增強代碼的可讀性(若外部類(lèi)要訪(fǎng)問(wèn)內部類(lèi)的成員,需要先產(chǎn)生內部的的一個(gè)對象,然后利用這個(gè)對象去引用內部類(lèi)的成員)
內部類(lèi)可以用于創(chuàng )建適配器類(lèi),適配器類(lèi)是用于實(shí)現接口的類(lèi)。使用內部類(lèi)來(lái)實(shí)現接口,可以更好地定位與接口關(guān)聯(lián)的方法在代碼中的位置
內部類(lèi)的更多用法
java.lang包下有個(gè)Exception類(lèi),它有很多子類(lèi)。不過(guò)雖然Exception類(lèi)在java.lang包下,但它的子類(lèi)不一定都在這同一個(gè)包中。Exception類(lèi)類(lèi)是從Throwable類(lèi)派生出來(lái)的
異常處理:
打開(kāi)一個(gè)不存在的文件、網(wǎng)絡(luò )連接中斷、數組下標越界、正在加載的類(lèi)文件丟失等都會(huì )引發(fā)異常
Java中的異常類(lèi)定義了程序中遇到的輕微的錯誤條件
Java中的錯誤類(lèi)定義了程序中不能恢復的嚴重錯誤條件。如內存溢出、類(lèi)文件格式錯誤等。這一類(lèi)錯誤由Java運行系統處理,不需要我們去處理
Java程序在執行過(guò)程中如出現異常,會(huì )自動(dòng)生成一個(gè)異常類(lèi)對象,該異常類(lèi)對象將被提交給Java運行時(shí)的系統,這個(gè)過(guò)程稱(chēng)為拋出(throw)異常
當Java運行時(shí)系統接收到異常對象時(shí),會(huì )尋找能處理這一異常的代碼把當前異常對象交給其處理,這一過(guò)程稱(chēng)為捕獲(catch)異常
如果Java運行時(shí)系統找不到可以捕獲異常的方法,則運行時(shí)系統將終止,相應的Java程序也將退出
try/catch/finally語(yǔ)句:把可能引發(fā)異常的代碼放到try里,在catch語(yǔ)句中對異常條件進(jìn)行處理。
若沒(méi)有進(jìn)行異常處理,在程序退出的時(shí)候會(huì )自動(dòng)調用printStackTrace()。
可以寫(xiě)多個(gè)catch。
不管程序有無(wú)異常,finally語(yǔ)句里的代碼都會(huì )執行。但當程序終止運行的時(shí)候,finally語(yǔ)句里的代碼就不會(huì )執行(如前有System.exit(-1))
拋出異常聲明函數throws
class Excep
{
public int division(int a,int b)
{
return a/b;
}
}
class ExcepTest
{
public static void main(String[] args)
{
Excep excep=new Excep();
try
{
excep.division(5,0);
System.out.println("exception");
}
catch(Exception e)
{
//System.out.println("can‘t");
//System.out.println(e.getMessage());
//System.out.println(e.toString());
e.printStackTrace();//異常發(fā)生的軌跡
}
System.out.println("finish");
}
}
----------------------------------------------------------------------
class Excep
{
public int division(int a,int b) throws Exception
{
return a/b;
}
}
class ExcepTest
{
public static void main(String[] args)
{
Excep excep=new Excep();
excep.division(5,0);
System.out.println("exception");
System.out.println("finish");
}
}
對于RuntimeException通常都不需要我們捕獲,這類(lèi)異常由Java運行系統自動(dòng)拋出并自動(dòng)處理。所以throws RuntimeException時(shí),Java不會(huì )強制要求捕獲,其他的會(huì )強制要求捕獲
如果父類(lèi)中的方法拋出多個(gè)異常,則子類(lèi)中的覆蓋方法要么拋出相同的異常,要么拋出異常的子類(lèi),但不能拋出新的異常(構造方法除外)
我們可以在方法聲名時(shí),聲名一個(gè)不會(huì )拋出的異常,Java編譯器就會(huì )強迫方法的使用者對異常進(jìn)行處理。這種方式通常應用于abstract base class和interface中
可以自己添加異常類(lèi),但必須從Exception中派生:
class DivisorIsMinusException extends Exception
{
DivisorIsMinusException(String str)
{
super(str);
}
}
Java編程規范:
package的名字由全部小寫(xiě)的字母組成,如:cn.mubole
class和interface的名字由大寫(xiě)字母開(kāi)頭而其他字母都小寫(xiě)的單詞組成,例如:Person,Exception
class變量的名字用一個(gè)小寫(xiě)字母的單詞開(kāi)頭,后面的單詞都用大寫(xiě)字母開(kāi)頭,例如:index,currentImage
class方法的名字用一個(gè)小寫(xiě)字母的單詞開(kāi)頭,后面的單詞都用大寫(xiě)字母開(kāi)頭,例如:run(),getBalance()
static final變量的名字所有字母都大寫(xiě),并且能表示完整含義。例如:PI,PASSWORD
參數的名字和變量的命名規范一致
數組應該總是用這樣的方式來(lái)命名:byte[] buffer