標籤:
內部類( Inner Class )就是定義在另外一個類裡面的類。與之對應,包含內部類的類被稱為外部類。將相關的類組織在一起,從而降低了命名空間的混亂。
內部類的好處:
1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包中的其他類訪問該類
2. 內部類的方法可以直接存取外部類的所有資料,包括私人的資料
3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便
內部類可分為以下幾種:
- 成員內部類 member inner class
- 靜態內部類 static inner class (also called nested class)
- 方法內部類 local inner class
- 匿名內部類 anonymous inner class
Java 中的成員內部類
內部類中最常見的就是成員內部類,也稱為普通內部類。我們來看如下代碼:
運行結果為:
從上面的代碼中我們可以看到,成員內部類的使用方法:
1、 Inner 類定義在 Outer 類的內部,相當於 Outer 類的一個成員變數的位置,Inner 類可以使用任意存取控制符,如 public 、 protected 、 private 等
2、 Inner 類中定義的 test() 方法可以直接存取 Outer 類中的資料,而不受存取控制符的影響,如直接存取 Outer 類中的私人屬性a
3、 定義了成員內部類後,必須使用外部類對象來建立內部類對象,而不能直接去 new 一個內部類對象,即:內部類 對象名 = 外部類對象.new 內部類( );
4、 編譯上面的程式後,會發現產生了兩個 .class 檔案
其中,第二個是外部類的 .class 檔案,第一個是內部類的 .class 檔案,即成員內部類的 .class 檔案總是這樣:外部類名$內部類名.class
另外,友情提示哦:
1、 外部類是不能直接使用內部類的成員和方法滴
可先建立內部類的對象,然後通過內部類的對象來訪問其成員變數和方法。
2、 如果外部類和內部類具有相同的成員變數或方法,內部類預設訪問自己的成員變數或方法,如果要訪問外部類的成員變數,可以使用 this 關鍵字。如:
運行結果:
Java 中的靜態內部類
靜態內部類是 static 修飾的內部類,這種內部類的特點是:
1、 靜態內部類不能直接存取外部類的非靜態成員,但可以通過 new 外部類().成員 的方式訪問
2、 如果外部類的靜態成員與內部類的成員名稱相同,可通過“類名.靜態成員”訪問外部類的靜態成員;如果外部類的靜態成員與內部類的成員名稱不相同,則可通過“成員名”直接調用外部類的靜態成員
3、 建立靜態內部類的對象時,不需要外部類的對象,可以直接建立 內部類 對象名= new 內部類();
運行結果 :
Java 中的方法內部類
方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
注意:由於方法內部類不能在外部類的方法以外的地方使用,因此方法內部類不能使用存取控制符和 static 修飾符。
匿名內部類
匿名內部類就是沒有名字的局部內部類,不使用關鍵字class, extends, implements, 沒有構造方法。
匿名內部類隱式地繼承了一個父類或者實現了一個介面。
匿名內部類使用得比較多,通常是作為一個方法參數。
匿名內部類使用測試
package com.learnjava.innerclass;
import java.util.Date;
public class AnonymouseInnerClass
{
@SuppressWarnings("deprecation")
public String getDate(Date date)
{
return date.toLocaleString();
}
public static void main(String[] args)
{
AnonymouseInnerClass test = new AnonymouseInnerClass();
// 列印日期:
String str = test.getDate(new Date());
System.out.println(str);
System.out.println("----------------");
// 使用匿名內部類
String str2 = test.getDate(new Date()
{
});// 使用了花括弧,但是不填入內容,執行結果和上面的完全一致
// 產生了一個繼承了Date類的子類的對象
System.out.println(str2);
System.out.println("----------------");
// 使用匿名內部類,並且重寫父類中的方法
String str3 = test.getDate(new Date()
{
// 重寫父類中的方法
@Override
@Deprecated
public String toLocaleString()
{
return "Hello: " + super.toLocaleString();
}
});
System.out.println(str3);
}
}
產生的.class檔案中,匿名類會產生OuterClass$1.class檔案,數字根據是第幾個匿名類而類推。
Java中的內部類