?來自: http://www.tkk7.com/lincode/archive/2008/08/13/221594.html
一 概念:
Java將嵌套類分成兩個主要的分類:靜態嵌套類(static nested classes)和內部類(inner classes)。
1 嵌套類(nested classes),在一個類內部定義的另一個類,稱為嵌套類。
? 嵌套類分為兩種, static 修飾的 靜態嵌套類, 和無 static 修飾的 非靜態嵌套類,也叫作 內部類。
2 內部類(inner classes), 無 static 修飾的 非靜態嵌套類。
Java還進一步將內部類分為:
實例內部類(instance inner class) ,假設在聲明嵌套類時,沒有在前面加上static關鍵字。這樣得到的是個實例內部類。靜態嵌套類只能夠訪問外部類的static成員,而實例內部類能夠同時訪問static和實例成員。
本地內部類(local inner class),Java允許在任意的代碼段中放入一個類,該類的代碼放在一對大括號中{? }。這意味著類能夠出現在一個方法中,甚至是在if語句的一對括號中。這樣的類就稱為本地內部類。相對于實例內部類來說,本地內部類和有一個好處。他除了能夠訪問外部類的實例和類字段外(稱為實例和類方法),還能夠訪問本地變量和方法的參數。
匿名內部類(and anonymous inner class),沒有給出類名的內部類為匿名內部類。
二 使用:
1. 訪問內部類:
我們可以在嵌套類(包括靜態的和非靜態的 )前加上 private,protected 或 public 關鍵字,以指示該類在外部類以外的訪問級別。
具體訪問方法如下:
(1).內部類,要以如下形式訪問, outclass 是 OutClass 的一個實例,它放在 new 前指示內部類的實例是屬于一個特定的外部類的實例的。 這是因為,只有外部類的實例存在,他的實例內部類( 也就是非靜態內部類)才能存在。
?? //
innerclass
? OutClass?outclass?
=
?
new
?OutClass();
?
??OutClass.InnerClass?innerclass?
=
?outclass.
new
?InnerClass();
??innerclass.normalMethod();
(2).靜態嵌套類, 可以用 OutClass.StaticInnerClass 來指示。
靜態嵌套類,可以有實例成員(實例方法 和 實例變量)
訪問靜態嵌套類的實例域,需要先實例化靜態嵌套類。
這個類是靜態的,它不依賴于它外部類的某個實例,所以無須先實例化外部類。這和內部類是不一樣的。
? OutClass.StaticInnerClass?staticinnerclass?=?new
?OutClass.StaticInnerClass();
??staticinnerclass.normalMethod();
(3).靜態嵌套類的靜態方法,可以用 OutClass.StaticInnerClass.staticMethod() 來訪問。
實例代碼:
//
?OutClass.java
public
?
class
?OutClass?{
????
//
non static inner classes
????
class
?InnerClass{
????
????????
public
?
void
?normalMethod(){
????????????System.out.println(
"
?success: non-static innerclass
"
);
????????}
????}
????
????
//
static inner classes
????
static
?
class
?StaticInnerClass
????{
????????
//
non?static?method of static inner classes
????????
public
?
void
?normalMethod()
????????{
????????????System.out.println(
"
?success:?non?static?method of?static?innerclas
"
);
????????}
????????
????????
//
?static?methode?of static inner classes
????????
static
?
public
?
void
?staticMethod()
????????{
????????????System.out.println(
"
?success:?static?method of?static?innerclass
"
);
????????}
????}
}
//
end of InnerClass
//
?Test.java
public
?
class
?Test?{
public
?
static
?
void
?main(String[]?args){
??OutClass?outclass?
=
?
new
?OutClass();
??
??
//
?innerclass
??OutClass.InnerClass?innerclass?
=
?outclass.
new
?InnerClass();
??innerclass.normalMethod();
??
??
//
?non?static?method of?static?innerclas
??OutClass.StaticInnerClass?staticinnerclass?
=
?
new
?OutClass.StaticInnerClass();
??staticinnerclass.normalMethod();
??
//
?static?method of?static?innerclass
??OutClass.StaticInnerClass.staticMethod();?
??}
}
//
end of Test
2. 嵌套類 訪問 外部類的成員:
(1). 外部類對于內部類(非靜態嵌套類)是透明的。包括外部類的private成員,其內部類都可以自由訪問。
(2). 一個靜態嵌套類只能訪問外部類的靜態方法,它是不能訪問任何外部類的實例成員(包括變量和方法)。
(3). 內部類中的 this 是指內部類本身。內部類的成員和外部類的成員名沖突,內部類內,沖突的成員名是指內部類成員。
要調用外部類的沖突的成員,要以 外部類的類名 指示:對于沖突的變量 OutClass.conflitName? 對于沖突的方法 OutClass.conflitName()。