1. 程式人生 > >靜態非靜態內部類匿名內部類局部內部類

靜態非靜態內部類匿名內部類局部內部類

stat 內部 實例 () 靜態內部類 靜態 外部類 通過 color

內部類有靜態內部類,靜態內部類,匿名內部類,局部內部類

(1)非靜態內部類

直接在類的內部定義的類就是非靜態內部類,如下

public class Test {
    public static void main(String[] args) {
        Outer.Inner c1=new Outer().new Inner();
        c1.Print();
    }    
}
class Outer{
    private int temp=10;
    class Inner{
        private int temp=100;
        public
void Print() { int temp=1000; System.out.println("外部類成員變量"+Outer.this.temp); System.out.println("內部類成員變量"+this.temp); System.out.println("局部變量"+temp); } } }

外部類成員變量10
內部類成員變量100
局部變量1000

我們可以看出

  • 內部類對象的創建是建立在外部類對象的基礎上的,先有了外部類對象才能有內部類對象
  • 內部對象基於外部對象,內部對象1存在時外部對象一定存在,所以可以直接訪問外部類成員,但反之不行,應為外部對象存在時不保證內部類也存在
  • 非靜態內部類不能存在靜態的方法,屬性和初始化塊
  • 外部類的靜態方法和靜態代碼塊不能訪問非靜態內部類

(2)靜態內部類

帶有static的內部類

public class Test {
    public static void main(String[] args) {
        Outer.Inner c1=new Outer.Inner();
        c1.Print();        
    }
    
}
class Outer{
    private int temp=10;
    static class Inner{
        private
int temp=100; public void Print() { int temp=1000; System.out.println(this.temp); System.out.println(temp); } } }

靜態內部類有以下特征

  • 靜態內部類對象的創建不依賴於外部類對象
  • 根據上面的特點,靜態內部類的實例方法不能直接訪問外部類的實例方法
  • 靜態內部類被看做是外部類的一個靜態成員,所以外部類的靜態方法可以通過“靜態內部類.名字”的方式訪問靜態內部類的靜態成員,通過new靜態內部類訪問靜態內部類的實例

3)匿名內部類

在只用一次的情況下使用匿名內部類,用完就丟棄。主要作用比如,有接口AA,現在想調用實現接口AA的方法

就必須有實現接口的實現類,比如BB,加入這個類只是用一次,我們可以使用匿名內部類來實現

public class Test {    
    public static void T(AA a) {
        a.aa();
    }    
    public static void main(String[] args) {
        
        Test.T(new AA(){
            @Override
            public void aa() {
                // TODO Auto-generated method stub
                System.out.println("匿名內部類");
            }            
        });
    }    
}
interface AA {
    void aa();
}

在上面的代碼中,我們在方法調用時才去new一個AA的實現類

(4)局部內部類

方法內部定義的內部類,作用域僅限於方法內部

public class Test {        
    public void show() {
        class Inner{
            public void run() {
                System.out.println("局部內部類");
            }
        }
        new Inner().run();
    }    
    public static void main(String[] args) {        
        new Test().show();
    }    
}

靜態非靜態內部類匿名內部類局部內部類