一、內部類Inner class
在一個類內部定義的類,可以有兩種定義方式:
1. 定義在外部類裏面,作爲外部類的成員變量,此時可以用public, protected, default, private等訪問修飾符修飾,其實際意義就是等價於外部類的一個成員變量。
package com.wbf;
public class Outer {
//public, protected, private等訪問修飾符都可以,此時的Inner1就等價於Outer類的成員變量
//當我們在外部類的外面要創建Inner1的實例對象時,必須先創建外部類的實例對象,再通過外部類實例對象去創建內部類實例對象才行。見class My test1()
public class Inner1 {
}
}
class My {
void test1() {
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Inner1();
Outer.Inner3 inner3 = new Outer.Inner3();
}
}
2. 定義在外部類的某個方法裏面,此時就不是外部類的成員變量了,而是外部類這個方法的局部變量,不可以用訪問修飾符修飾,只可以用static, final修飾。這種內部類既然等價於方法的局部變量,就和局部變量一樣,即在方法內部先定義,方法後續的語句纔可以使用。分有名內部類和匿名內部類:
package com.wbf;
public class Outer {
int out_x = 0;
public void method() {
Inner1 inner1 = new Inner1();
//方法內部定義的內部類不可以有訪問修飾符
//這種內部類就等價於方法內部的局部變量,此時的修飾符只可以用final, abstract
//這種內部類既然等價於方法的局部變量,就和局部變量一樣,即在方法內部先定義,方法後續的語句纔可以使用。
//同時也說明這種內部類的作用域就是定義的方法,方法外部無法訪問
class Inner2 {
public void method() {
out_x = 3;
}
}
Inner2 inner2 = new Inner2();
}
}
class My {
void test2() {
Outer.Inner3 inner3 = new Outer.Inner3();
}
}
package com.wbf;
public class Outer {
//方法內部定義的匿名內部類
public void start() {
new Thread(new Runnable() {
public void run() {
}
}).start();;
}
}
二、靜態嵌套類
有兩種:
1. 在外部類中定義的成員變量內部類加上static關鍵字修飾,即變爲靜態嵌套類
package com.wbf;
public class Outer {
//方法外部定義的內部類,加上static關鍵字,就變爲static nested class,靜態嵌套類
//在外部類的外面不需要創建外部類的實例對象就可以就可以直接創建static nested class,見class My test2()
public static class Inner3 {
}
}
class My {
void test2() {
Outer.Inner3 inner3 = new Outer.Inner3();
}
}
2. 在外部類的static方法中定義的內部類,即爲靜態嵌套類
package com.wbf;
public class Outer {
static int x = 10;
public static void method2() {
final int y = 20;
int z = 30;
//靜態方法中定義的內部類也是static nested class,但是此時這個內部類就不可以用static修飾了,只可以用abstract, final修飾
class Inner4 {
public void method() {
x++; //訪問外部類中的靜態成員變量
//y++; //The final local variable y cannot be assigned, since it is defined in an enclosing type
//z++; //Cannot refer to the non-final local variable z defined in an enclosing scope
}
}
}
}