天天看點

java匿名類和匿名對象及this的其他用法

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

  

繼續閱讀