Java中內部類和匿名內部類的詳解

1、內部類

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

1.1 成員內部類

定義在類中方法外的類。

定義格式:

class 外部類 {
    class 內部類{

    }
}

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

代碼舉例:

class Car { //外部類
    class Engine { //內部類

    }
}

1.2 訪問特點

成員內部類可以直接訪問外部類的成員變量和成員方法。

外部類不可以直接訪問內部類的成員變量和成員方法。

外部類想要訪問內部的成員: 得創建內部類對象來訪問內部類成員。

外部類名.內部類名 對象名 = new 外部類名().new 內部類名();

訪問演示,代碼如下:

定義類:

public class Person {
    private  boolean live = true;
    class Heart {
        public void jump() {
            // 直接訪問外部類成員
            if (live) {
                System.out.println("心臟在跳動");
            } else {
                System.out.println("心臟不跳了");
            }
        }
    }

    public boolean isLive() {
        return live;
    }

    public void setLive(boolean live) {
        this.live = live;
    }
}

定義測試類:

public class InnerDemo {
    public static void main(String[] args) {
        // 創建外部類對象 
        Person p  = new Person();
        // 創建內部類對象
        Heart heart = p.new Heart();

        // 調用內部類方法
        heart.jump();
        // 調用外部類方法
        p.setLive(false);
        // 調用內部類方法
        heart.jump();
    }
}

輸出結果:
心臟在跳動
心臟不跳了

2、匿名內部類

一個繼承了類的子類的匿名對象 或者一個實現了接口的實現類的匿名對象。

開發中,最常用到的內部類就是匿名內部類了。以接口舉例,當你使用一個接口時,似乎得做如下幾步操作。

1、定義子類

2、重寫接口中的方法

3、創建子類對象

4、調用重寫後的方法

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

條件

匿名內部類必須繼承一個父類或者實現一個父接口

2.1 格式

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

使用方式

以接口爲例,匿名內部類的使用,代碼如下:

定義接口:

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

創建匿名內部類,並調用:

public class InnerDemo {
    public static void main(String[] args) {
        /*
        1.等號右邊:是匿名內部類,定義並創建該接口的子類對象
        2.等號左邊:是多態賦值,接口類型引用指向子類對象
        */
        FlyAble  f = new FlyAble(){
            public void fly() {
                System.out.println("我飛了~~~");
            }
        };

        //調用 fly方法,執行重寫後的方法
        f.fly();
    }
}

通常在方法的形式參數是接口或者抽象類時,也可以將匿名內部類作爲參數傳遞。代碼如下:

public class InnerDemo2 {
    public static void main(String[] args) {
        /*
        1.等號右邊:定義並創建該接口的子類對象
        2.等號左邊:是多態,接口類型引用指向子類對象
       */
        FlyAble  f = new FlyAble(){
            public void fly() {
                System.out.println("我飛了~~~");
            }
        };
        // 將f傳遞給showFly方法中
        showFly(f);
    }
    public static void showFly(FlyAble f) {
        f.fly();
    }
}

以上兩步,也可以簡化爲一步,代碼如下:

public class InnerDemo3 {
    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();
    }
}

原文作者:一直千尋

原文地址:https://www.cnblogs.com/libinhong/p/10990602.html

(感謝原文作者的分享)

 

分享其他學習資料:

Java內部類和匿名內部類的用法

Java 局部內部類、匿名內部類詳解

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章