Java中的內部類一:什麼是內部類;二:Java 中的成員內部類;三:Java 中的靜態內部類;四:Java 中的方法內部類; ...
Java中的內部類
一:什麼是內部類;
(1).什麼是內部類呢?
內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。
(2).那為什麼要將一個類定義在另一個類裡面呢?獨立的一個類不好嗎?
內部類的主要作用如下:
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接訪問外部類的所有數據,包括私有的數據
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
(3)內部類有幾種呢?
內部類可分為以下幾種:
- 成員內部類
- 靜態內部類
- 方法內部類
- 匿名內部類
二:Java 中的成員內部類;
內部類中最常見的就是成員內部類,也稱為普通內部類。我們來看如下代碼:
//外部類HelloWorld public class HelloWorld{ private int a = 99;//外部類的私有屬性 //內部類Inner public class Inner{ int b = 2; public void test(){ System.out.println("訪問外部類中的a:"+a); System.out.println("訪問內部類中的b:"+b); } } //測試成員內部類 public static void main(String[]args){ HelloWorld o = new HelloWorld();//創建外部類對象,對象名為o Inner i = o.new Inner();//使用外部類對象創建內部類對象,對象名為i i.test();//調用內部類對象的test方法 } }
運行結果為:
從上面的代碼中我們可以看到,成員內部類的使用方法:
1、 Inner 類定義在 HelloWorld類的內部,相當於 HelloWorld 類的一個成員變數的位置,Inner 類可以使用任意訪問控制符,如 public 、 protected 、 private 等
2、 Inner 類中定義的 test() 方法可以直接訪問 HelloWorld類中的數據,而不受訪問控制符的影響,如直接訪問 HelloWorld類中的私有屬性a
3、 定義了成員內部類後,必須使用外部類對象來創建內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );
4、 編譯上面的程式後,會發現產生了兩個 .class 文件
HelloWorld.class
HelloWorld$Inner.class
其中,第二個是外部類的 .class 文件,第一個是內部類的 .class 文件,即成員內部類的 .class 文件總是這樣:外部類名$內部類名.class
另外,註意:
1、 外部類是不能直接使用內部類的成員和方法滴
可先創建內部類的對象,然後通過內部類的對象來訪問其成員變數和方法。
2、 如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數,可以使用 this 關鍵字。如:
//外部類HelloWorld public class HelloWorld{ int b = 1; //內部類Inner public class Inner{ int b = 2; public void test(){ System.out.println("訪問外部類中的b:"+HelloWorld.this.b); System.out.println("訪問內部類中的b:"+b); } } //測試成員內部類 public static void main(String[]args){ HelloWorld o = new HelloWorld();//創建外部類對象,對象名為o Inner i = o.new Inner();//使用外部類對象創建內部類對象,對象名為i i.test();//調用內部類對象的test方法 } }
運行結果為:
三:Java 中的靜態內部類;
靜態內部類是 static 修飾的內部類,這種內部類的特點是:
1、 靜態內部類不能直接訪問外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問
2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
3、 創建靜態內部類的對象時,不需要外部類的對象,可以直接創建 內部類 對象名= new 內部類();
舉個例子:
//外部類HelloWorld public class HelloWorld{ private int a = 99;//外部類的私有變數 static int b = 1;//外部類的靜態變數 //靜態內部類 public static class SInner{ int b =2; public void test(){ System.out.println("訪問外部類中的b:"+HelloWorld.b); System.out.println("訪問內部類中的b:"+b); } } //測試靜態內部類 public static void main(String[]args){ SInner si = new SInner();//直接創建內部類的對象 si.test();//調用test方法 } }
運行結果為:
四:Java 中的方法內部類;
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
舉一個例子:
//外部類HelloWorld public class HelloWorld{ //外部類中的方法 public void show(){ final int a =25;//常量 int b = 13;//變數 //方法內部類 class MInner{ int c =2;//內部類中的變數 public void print(){ System.out.println("訪問外部類的方法中的常量a:"+a); System.out.println("訪問內部類中的變數c:"+c); } } MInner mi = new MInner();//創建方法內部類中的對象 mi.print();//調用內部類中的方法 } //測試方法內部類 public static void main(String[]args){ HelloWorld mo = new HelloWorld(); mo.show();//調用外部類的方法 } }
註意:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用訪問控制符和 static 修飾符。