1. 程式人生 > >靜態非靜態內部類匿名內部類區域性內部類

靜態非靜態內部類匿名內部類區域性內部類

內部類有靜態內部類,靜態內部類,匿名內部類,區域性內部類

(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();
    }    
}