靜態非靜態內部類匿名內部類局部內部類
阿新 • • 發佈:2019-01-01
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; publicvoid 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{ privateint 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(); } }
靜態非靜態內部類匿名內部類局部內部類