JavaSE--內部類

1.內部類:

類裏面的類,就稱之爲內部類。
內部類的class文件的形式:Outer$Inner.class
內部類對象實例化:Outer.Inner in = new Outer().new Inner();

1)內部類用法:

內用外,隨意使用;外用內,需要內部類對象。
這裏可以和局部變量與全局變量一起理解。

2)分類:

I.成員內部類

●間接使用成員內部類:在外部類的方法中,使用內部類;main只是調用內部類的方法。
●直接使用成員內部類:【Outer.Inner in = new Outer().new Inner();】
●變量重名時:Outer.this.外部類成員變量名
下面的代碼就兩種都寫上了,註釋裏都解釋了

class Outer{								//外部類
    String msg = "外部類的全局變量";
    class Inner{							//內部類
        String msg ="內部類的全局變量";		
        public void print(){
            String msg ="內部類的局部變量";
            System.out.println(msg);		//局部變量,就近原則
            System.out.println(this.msg);		//內部類的全局變量
            System.out.println(Outer.this.msg);		//直接訪問外部類的私有屬性
        }
    }
    public void fun(){                      //外部類方法
        System.out.println(new Inner().msg);		//間接利用內部類(匿名)對象訪問內部類中的私有屬性
    }
}

public class Test{
    public static void main(String args[]){
        Outer.Inner in = new Outer().new Inner();	//實例化內部類對象
        in.print();									//調用內部類的方法
        Outer out = new Outer();						//實例化外部類對象
        out.fun();									//調用外部類的方法
    }
}
/運行結果:
內部類的局部變量
內部類全局變量
外部類全局變量
內部類全局變量

II.局部內部類

在方法中定義的內部類。
注意:"局部"只有當前所屬方法才能使用,出了這個方法外面就不能用了。(即局部內部類的對象,必須定義在方法裏面)
在這裏插入圖片描述

class Outer{
    public void methodOuter(){
        class Inner{                //局部內部類
            final int num = 10;     //所在方法的局部變量
            public void methodInner(){
                System.out.println(num);
            }
        }
        new Inner().methodInner();					//內部類實例化對象調用methodInner()輸出
    }
}

public class Test2 {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.methodOuter();
    }
}

局部內部類的final問題:
局部內部類,如果希望訪問所在方法的局部變量,那麼這個局部變量必須是【有效final的】。
備註:從Java 8+開始,只要局部變量事實不變,那麼final關鍵字就可以省略。
原因:
●new出來的對象在堆內存當中,局部變量是跟着方法走的,在棧內存當中。
●方法運行結束之後,立刻出棧,局部變量就會立刻消失。但是new出來的對象會在堆內存中持續存在,直到垃圾回收。

III.匿名內部類

①何時使用匿名內部類?

如果接口的實現類(或者是父類的子類)只需要使用唯一的一次,那麼這種情況下就可以省略掉該類的定義,而改爲使用【匿名內部類】。
隨用隨定義!

//IMyInterface即創建的接口,裏面有抽象方法method。
//使用匿名內部類
IMyInterface obj = new IMyInterface() {
    @Override
    public void method() {
        System.out.println("匿名內部類實現了方法!");
    }
};
obj.method();
②對匿名內部類格式進行分析:
IMyInterface obj = new IMyInterface() {
	    @Override
	    //覆蓋重寫所有抽象方法
};

●new代表創建對象的動作,接口名稱(IMyInterface)就是匿名內部類需要實現哪個接口。
●{ … };這纔是匿名內部類的內容。

③需要注意的問題:

●匿名內部類:在【創建對象】的時候,只能使用唯一一次。
如果希望多次創建對象,就必須使用單獨定義的impl實現類。
●匿名對象:在【調用方法】的時候,只能調用唯一一次。
如果希望同一個對象調用多次方法,就必須給對象起名。
●匿名內部類是省略了【實現類/子類名稱】,但是匿名對象是省略了【對象名稱】。
二者不是同一個意思。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章