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實現類。
●匿名對象:在【調用方法】的時候,只能調用唯一一次。
如果希望同一個對象調用多次方法,就必須給對象起名。
●匿名內部類是省略了【實現類/子類名稱】,但是匿名對象是省略了【對象名稱】。
二者不是同一個意思。