靜態非靜態內部類匿名內部類區域性內部類
阿新 • • 發佈:2019-01-01
內部類有靜態內部類,靜態內部類,匿名內部類,區域性內部類
(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(); } }