1. 程式人生 > >Java 之內部類

Java 之內部類

定義

內部類是定義在一個類裡面的類,與之對應的包含內部類的類為外部類。

作用
  1. 內部類提供了更好的封裝,可以把內部類隱藏在外部類之內,不允許同一個包的其他類訪問該類。
  2. 內部類的方法可以直接訪問外部類的所有資料,包括私有資料;外部類不可以直接訪問內部類成員和方法,需要先建立物件。
  3. 內部類所實現的功能使用外部類同樣可以實現,只是有時使用內部類更方便 。
public class HelloWorld{
    public class InnerClass{
        public void show(){
            System.out.println("hello"
) } } public static void main(String[] args){ HelloWorld helloworld = new HelloWprld(); InnerClass ic = helloworld.new InnerClass();//訪問時要加一級 ic.show; } }
分類

成員內部類、靜態內部類、方法內部類、匿名內部類

成員內部類
  1. Inner 類定義在 HelloWorld 類的內部,相當於 HelloWorld 類的一個成員變數的位置,Inner 類可以使用任意訪問控制符,如:public,private 等。
  2. Inner 類中定的show()方法可以直接訪問外部類資料,不受訪問控制符的影響。
  3. 定義了成員內部類後,必須使用外部類的物件建立內部類的物件,不可以直接new一個內部類的物件,用static修飾的內部類除外,語法為:內部類 物件名 = 外部類物件.new 內部類();
  4. 編譯時,產生兩個class檔案,外部類名 $ 內部類名 .class 為內部類檔案。
  5. 外部類不可以直接訪問內部類成員和方法,需要先建立物件。
  6. 如果外部類與內部類具有相同的成員變數或者方法時,內部類預設訪問自己的成員變數和方法,如果訪問外部類的成員變數,則為外部類名.this.成員變數
靜態內部類
  1. 靜態內部類是有 static 修飾的內部類。
  2. 靜態內部類不能直接訪問外部類的非靜態成員,可以通過”new 外部類().成員“訪問。
  3. 如果外部類的靜態成員與內部類的成員名稱相同,則通過”類名.靜態成員“訪問外部類的靜態成員;若不相同,則可以直接通過”成員名“呼叫。
  4. 建立靜態內部類物件時,不需要外部類的物件內部類 物件名 = new 內部類();
方法內部類
  1. 方法內部類就是內部類定義在外部類的方法中,方法內部類只在該方法的內部可見,即只在該方法內可以使用。
  2. 方法內部類不能使用訪問控制符和static修飾。
匿名內部類
  1. 匿名內部類沒有類名,無 class 關鍵字,所以只能使用一次。
  2. 必須繼承一個父類或者實現一個介面,同時只能繼承或者實現一個類或者一個介面。
  3. 匿名內部類中不能定義建構函式。
  4. 匿名內部類不能存在任何靜態成員變數和方法
  5. 匿名內部類不能是抽象的,所以必須實現繼承的類或介面中的所有方法。
  6. 建立語法:
new 父類構造器(引數列表)| 介面(){
    //匿名內部類的主體部分
}

如 Android 中對於一個 Button 進行偵聽

button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v){
        Toast.makeText(FirstActivity.this, "aa", Toast.LENGTH_SHORT).show();
    }
});