/* 匿名內部類:就是內部類的簡寫格式。 必須前提:內部類必須繼承或者實現一個類或者接口。 匿名內部類其實就是一個匿名 子類對象。 格式: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(); } }