1. 程式人生 > 實用技巧 >內部類和匿名內部類

內部類和匿名內部類

目錄

1. 內部類

1.1 概述

將一個類A定義在另一個類B裡面,裡面的那個類A就稱為內部類,B則稱為外部類

1.2 成員內部類

定義在類中方法外的類,稱為成員內部類。

定義格式

class 外部類 {
    class 內部類{
    }
}

在描述事物時,若一個事物內部還包含其他事物,就可以使用內部類這種結構。比如,汽車類 Car 中包含發動機 類 Engine ,這時, Engine 就可以使用內部類來描述,定義在成員位置。

訪問特點:

  • 內部類可以直接訪問外部類的成員,包括私有成員。
  • 外部類要訪問內部類的成員,必須要建立內部類的物件

程式碼舉例:

class Car { //外部類
    class Engine { //內部類
    }
}
//建立成員內部類物件格式:外部類名.內部類名 物件名 = new 外部型別().new 內部型別();

1.3 匿名內部類

匿名內部類是內部類的簡化寫法。它的本質是一個 帶具體實現的父類或者父介面的匿名的 子類物件。 開發中,最常用到的內部類就是匿名內部類了。

以介面舉例,當你使用一個介面時,似乎得做如下幾步操作:

  1. 定義子類
  2. 重寫介面中的方法
  3. 建立子類物件
  4. 呼叫重寫後的方法

我們的目的,最終只是為了呼叫方法,那麼能不能簡化一下,把以上四步合成一步呢?匿名內部類就是做這樣的快 捷方式。

前提:匿名內部類必須繼承一個父類或者實現一個父介面。

匿名內部類使用格式:

new 父類名或者介面名(){
    // 方法重寫
    @Override
    public void method() {
    // 執行語句
    }
};

實現一個介面的使用方式:

1.定義一個介面

public abstract class FlyAble{
	public abstract void fly();
}

2.建立一個匿名內部類並呼叫

public static void main(String[] args) {
    /*
    1.等號右邊:是匿名內部類,定義並建立該介面的子類物件
    2.等號左邊:是多型賦值,介面型別引用指向子類物件
    */
    FlyAble f = new FlyAble(){
        public void fly() {
        	System.out.println("我飛了~~~");
        }
    };
    //呼叫 fly方法,執行重寫後的方法
    f.fly();
}

方法的形式引數是介面或者抽象類的使用方式:

public static void main(String[] args) {
    /*
    建立匿名內部類,直接傳遞給showFly(FlyAble f)
    */
    showFly( new FlyAble(){
        public void fly() {
        	System.out.println("我飛了~~~");
        }
    });
}
public static void showFly(FlyAble f) {
	f.fly();
}