在Java中,容許在一個類的內部定義類,這樣的類稱做內部類,這個內部類所在的類稱做外部類。根據內部類的位置、修飾符和定義的方式可分爲成員內部類、靜態內部類、方法(局部內部類)內部類。html
內部類:一個類定義在另一個類的內部,那麼該類就稱做爲內部類。
內部類的class文件名: 外部類$內部類. 好處:便於區分該class文件是屬於哪一個外部類的。java
成員內部類優化
在類中除了能夠定義成員變量、成員方法,還能夠定義類,這樣的類被稱做成員內部類。spa
成員內部類的訪問方式:
方式一:在外部類提供一個方法建立內部類的對象進行訪問。code1使用此方式
方式二:在其餘類直接建立內部類的對象。code2使用此方式code
格式:外部類.內部類 變量名 = new 外部類().new 內部類();
htm
code1對象
class A{ int num = 10 ; //下面的代碼定義了一個成員方法,方法中訪問內部類 public void test(){ B a = new B() ; a.show() ; } //下面的代碼定義了一個成員內部類 class B{ public void show(){ System.out.println("num = "+num) ; } } } class Demo1{ public static void main(String[] args) { A a = new A() ; a.test() ; } }運行結果:
num = 10it
code2class
class A{ int num = 10 ; //下面的代碼定義了一個成員內部類 class B{ public void show(){ System.out.println("num = "+num) ; } } } class Demo2{ public static void main(String[] args) { A.B a = new A().new B() ; a.show() ; } }運行結果:
num = 10test
內部類的好處:內部類能夠直接訪問外部類的全部成員。
靜態內部類
可使用static關鍵字來修飾一個成員內部類,該內部類被稱做靜態內部類,它能夠在不建立外部類對象的狀況下被實例化(由於靜態內部類隨着外部類的加載而加載)。
靜態內部類,在其餘類建立 的格式:
外部類.內部類 變量名 = new 外部類.內部類(); code3使用此方式
code3
class A{ //定義靜態成員變量 static int num = 10 ; //下面的代碼定義了一個靜態內部類 static class B{ public void show(){ System.out.println("num = "+num) ; } } } class Demo3{ public static void main(String[] args) { A.B a = new A.B() ; a.show() ; } }
運行結果:
num = 10
P.S.
在靜態內部類中只能訪問外部類的靜態方法,若是將外部類的靜態成員num的static關鍵字去掉,將會報錯
在靜態內部類中能夠定義靜態的成員,而在非靜態的內部類中不容許定義靜態的成員。(由於內部類中的靜態成員隨着內部類的加載而加載,可是這樣違背了當初sun公司定義的:靜態的成員數據是不須要對象存在才能訪問。)
方法內部類(局部內部類)
方法內部類是指在成員方法中定義的類,它只能在當前方法中被使用。
局部內部類: 在一個類 的方法內部定義另一個類,那麼另一個類就稱做爲局部內部類。
局部內部類要注意的細節:
局部內部類能夠訪問外部類的成員變量、code4實現了此句話
若是局部 內部類訪問了一個局部變量,那麼該局部變量必須使用final修飾(java1.8如下 局部變量沒有用final修飾會報錯)、 (個人java1.8 試驗過了,沒有final也不會報錯,估計優化了吧。。)
code4
class A{ int num = 10 ; //下面的代碼定義了一個成員內部類 public void test(){ class B{ public void show(){ System.out.println("num = "+num) ; } } //因爲B類是方法內部類,所以只能在方法中建立該類的實例對象並調用show()方法、 B b = new B() ; b.show() ; } } class Demo4{ public static void main(String[] args) { A a = new A() ; a.test() ; } }運行結果:
num = 10
在A類的test()方法中定義了一個內部類B ,因爲B類是方法的內部類,所以程序只能在方法中建立該類的實例對象並調用show()方法。 從結果上看,方法內部類能夠訪問外部類的成員變量。
看完本章節以爲對本身都幫助的,寫個評論頂頂