/*
匿名內部類:就是內部類的簡寫格式。
必須前提:內部類必須繼承或者實現一個類或者接口。
匿名內部類其實就是一個匿名 子類對象。
格式:new 父類對象 or 接口(){
子類內容;(覆蓋父類的, 而且可以增加自己的方法)
}//相當於將 繼承父類 和 new 的過程 寫到了一起有某有!很方便有某有!
*/
class Outer{
int num;
public Outer(){
num = 5;
}
class Inner{
int num;
public Inner(){
num = 10;
}
public void show(){//也就是調用該方法會有兩個this指針入棧,why?很簡單,因為內部類要訪問外部類的數據啊!
int num = 11;
System.out.println("Inner part num " + num);//打印內部類中方法中的局部num變量
System.out.println("Inner num " + this.num);//打印內部類中num成員變量
//System.out.println("Inner num " + Inner.this.num);//打印內部類中num成員變量
System.out.println("Outer num " + Outer.this.num);//打印外部類中num成員變量
}
}
public void methods(){
final int num = 55;//這個變量為什么一定要用final修飾呢?
//因為如果不用final修飾,num就是一個局部變量,當這個函數結束之后就會消失!
//而我們是在局部內部類的中訪問這個num,這個類產生的對象是在堆上的,函數結束
//對象也不會消失,那么這個對象在以后可能會多次訪問這個num變量,這樣就出錯了!
//如果是final, num 就是 55這一個值,不會變!
class InnerTwo{
void show(){
System.out.println("part Inner final num = " + num);
}
}
InnerTwo in = new InnerTwo();
in.show();
}
public void way(){
System.out.println("******************************************");
//普通內部類:
new Inner().show();//匿名對象
new Inner(){ // 匿名內部類
public void show(){
System.out.println("內部類的匿名類!");
}
}.show();
//靜態內部類:
new InnerOne().way();
new InnerOne(){
public void way(){
System.out.println("靜態內部類的匿名類!");
}
}.way();
//外部類:
new Outer().show();
new Outer(){
public void show(){
System.out.println("外部類的匿名類!");
}
}.show();
}
static class InnerOne{
public static int num = 100;
public void way(){
System.out.println("靜態內部類中的方法!");
}
public static void show(){
System.out.println("static InnerOne num " + num);
}
}
public void show(){
System.out.println("Outer num " + num);
}
}
public class PC{
public static void main(String[] args){
Outer out = new Outer();
out.show();
Outer.Inner in = out.new Inner();
in.show();
// out.InnerOne.show();//類的所屬是類, 類是加載到方法區的,當然對象實例中不存在類;
Outer.InnerOne.show();
//匿名類和匿名對象的測試:
out.way();
}
}