一、實例內部類
需要創建實例去訪問內部類的方法
要創建內部類的實例,需要先創建外部類的實例
class outer{
public class InnerTool{ //內部類
public int add(int a,int b){
return a+b;
}
}
private InnerTool tool=new InnerTool();
public void add(int a,int b,int c){
tool.add(tool.add(a,b),c);
}
}
public void Tester{
public static void main(String args[]){
Outer.InnerTool tool=new Outer().new InnerTool();
//先創建外部類Outer在創建內部類InnerTool
tool.add(1,2);
}
}
實例內部類可以直接訪問外部類的所有成員變量以及方法,不管訪問權限。
重名變量的訪問
class Outer {
public int num = 10;
class Inner {//內部類
public int num = 20;
public void show() {
int num = 30;
System.out.println(num);//方法中的num
System.out.println(this.num);//內部類的num
System.out.println(Outer.this.num);//外部類的num
}
}
}
二、靜態內部類
創建靜態內部類的實例不需要創建外部類的實例
可以通過類名直接訪問靜態內部類的靜態成員,而非靜態成員需要創建實例才能訪問。
class A{
public static class B{//靜態內部類
int x;
static int y;
}
}
class Tester{
public void test(){
A.B b=new A.B();//不需要new A.()
b.x=1;//實例可訪問非靜態變量
b.y=1;//實例可訪問靜態變量
A.B.x=1;//錯誤,必須先實例化A.B
A.B.y=1;//直接通過類名訪問靜態內部類的靜態變量
}
}
三、局部內部類
局部內部類是在外部類的方法中的類,只能在當前方法中使用
class A{
B b=new B();//在方法之外無法訪問局部內部類
public void method(){
class B{//局部內部類
int a;
int b;
}
B b=new B();//在方法內可以訪問局部內部類
}
}
- 局部內部類可以訪問外部類所有成員
- 局部內部類可以訪問當前方法中最終變量或參數
最終變量或參數包括用final修飾的以及在該方法中從初始化開始就沒有被修改過值的變量,也就是實際上的最終變量或者參數
class A{
int a;
public void method(final int p1,int p2){
int localV1=1;
final int localV2=2;
int localV3=0;
localV3=1;
class B{//局部內部類
int b1=a;//外部類
int b2=p1;//final int
int b3=p2;//沒有被修改過值的參數
int b4=localV1;//沒有被修改過值的變量
int b5=localV2;//final int
int b6=localV3;//localV3被修改成了0
}
}
}
四、匿名類
匿名類是沒有名字的內部類
匿名類沒有構造方法,會調用父類的構造方法
public class A{
void method(){}
public static void main(String args[]){
A a=new A(){//匿名類
//匿名類實例a直接調用A類默認構造方法
void method(){...}//會override 類A中method方法
}
}
}
使用匿名類來重寫接口
interface Inter {
void show();
}
class Outer {
public static Inter method() {
return new Inter() {//匿名類
public void show() {//重寫接口show
System.out.println("oo");
}
};
}
}
public class Test {
public static void main(String[] args) {
Outer.method().show();
}
}
五、使用內部類的作用
- 內部類可以封裝方法
- 在需要用a類修改b類的private類型變量時,可以將a類 作爲b類的內部類
- 內部類可以回調
什麼叫回調?
一個類儘管實現了某種功能,但是沒有提供響應的接口,客戶類可以通過這個類的內部類的接口來獲得這個功能,在 四、匿名類 中的用匿名類來重寫接口就是一個很好的例子
六、內部類文件命名
對於每個內部類編譯器都會生成獨立的.class文件
- 成員內部類:外部類的名字$內部類的名字
- 局部內部類:外部類的名字$數字和內部類的名字
- 匿名類:外部類的名字$數字