Java內部類
內部類
內部類是指在一個外部類的內部再定義一個類。內部類作爲外部類的一個成員,並且依附於外部類而存在的。內部類可爲靜態,可用protected和private修飾(而外部類只能使用public和缺省的包訪問權限)。內部類主要有以下幾類:成員內部類、局部內部類、靜態內部類、匿名內部類。
每個內部類都能獨立地繼承自一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。如果沒有內部類提供的可以繼承多個具體的或抽象的類的能力,一些設計與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內部類有效地實現了“多重繼承”。
*成員內部類
1、作爲外部類的一個成員存在,與外部類的屬性、方法並列;
2、成員內部類中,不能定義靜態成員;
3、成員內部類中,可以訪問外部類的所有成員;
4、內部類和外部類的實例變量可以共存
5、在內部類中訪問內部類自己的變量直接用變量名或用this.變量名,在內部類中訪問外部類中與內部類同名的實例變量用外部類名.this.變量名,如果內部類中沒有與外部類同名的變量,則可以直接用變量名訪問外部類變量;
6、如果想要創建內部類對象,必須使用此外部類的一個對象來創建其內部類對象
例:
classOuter
{
…;
class inner()
{
…;
}
}
Outerout = new Outer();
Outer.Inner in= out.new Inner();
注意:內部類是一個編譯時的概念,一旦編譯成功,就會成爲完全不同的兩類。對於一個名爲outer的外部類和其內部定義的名爲inner的內部類。編譯完成後出現outer.class和outer$inner.class兩類。
*局部內部類
1、在方法中定義的內部類稱爲局部內部類。與局部變量類似,局部內部類不能有訪問說明符,因爲它不是外圍類的一部分,但是它可以訪問當前代碼塊內的常量,和此外圍類所有的成員;
2、可以定義與外部類同名的變量;
3、不可以定義靜態變量;
4、在內部類中訪問內部類自己的變量直接用變量名或用this.變量名,在內部類中訪問外部類中與內部類同名的實例變量用外部類名.this.變量名,如果內部類中沒有與外部類同名的變量,則可以直接用變量名訪問外部類變量;
5、訪問局部內部類必須先有外部類對象
*靜態內部類(嵌套類)
1.要創建嵌套類的對象,並不需要其外圍類的對象;
2.不能從嵌套類的對象中訪問非靜態的外圍類對象;
3、外部類訪問內部類的靜態成員:內部類.靜態成員;
4、外部類訪問內部類的非靜態成員:實例化內部類即可;
5、生成一個靜態內部類不需要外部類成員,靜態內部類的對象可以直接生成:Outer.Innerin = new Outer.Inner(); 而不需要通過生成外部類對象來生成
*匿名內部類
匿名內部類就是沒有名字的內部類。
格式:new父類或者接口()
{定義子類內容}
*什麼情況下需要使用匿名內部類?如果滿足下面的一些條件,使用匿名內部類是比較合適的:
1、只用到類的一個實例;
2、類在定義後馬上用到;
3、類非常小(SUN推薦是在4行代碼以下);
4、給類命名並不會導致你的代碼更容易被理解。
*在使用匿名內部類時,要記住以下幾個原則:
1、匿名內部類不能有構造方法;
2、匿名內部類不能定義任何靜態成員、方法和類;
3、匿名內部類不能是public,protected,private,static;
4、只能創建匿名內部類的一個實例;
5、一個匿名內部類一定是在new的後面,用其隱含實現一個接口或實現一個類;
6、因匿名內部類爲局部內部類,所以局部內部類的所有限制都對其生效
必要的引用,然後程序才能編譯通過。