內部類

目錄:

  1. 內部類概念
  2. 成員內部類
  3. 靜態內部類
  4. 局部內部類
  5. 匿名內部類

1.內部類概念:

什麼是內部類?

把A類定義在B類中,那麼A類就是內部類(類中類),B類就是外部類。
必須有外部類內部類才能生存

2.成員內部類:

在類中方法外的類

成員內部類的使用:

1.創建外部類對象
2.根據外部類對象創建內部類對象

成員內部類的好處:

可以直接使用外部類的成員

代碼演示:

public class Body { // 外部類
    boolean isLive = true;
    public void walk() {
        System.out.println("人在走路");
    }

    // 成員內部類
    class Heart { // 內部類
        String color = "黑色";
        public void jump() {
            if (isLive) {
                System.out.println("心臟跳動一下");
                walk();
            } else {
                System.out.println("心臟停止了跳動,涼涼!");
            }
        }
    }
}

測試類:

public class Demo05 {
    // 類中方法外,就是成員位置
    int a; // 成員變量
    public void test() { // 成員變量
    }

    public static void main(String[] args) {
        // 1.創建外部類對象
        Body b = new Body();
        // 2.根據外部類對象創建內部類對象
        Body.Heart h = b.new Heart();

        h.jump();

        b.isLive = false;
        h.jump();

        // 內部類創建方式二: 不推薦,只能找到內部類對象
        Body.Heart hh = new Body().new Heart();
    }
}

3.靜態內部類:

什麼是靜態內部類:

由static修飾的成員內部類

靜態內部類的創建格式:

外部類名.內部類名 變量名 = new 外部類名.內部類名();

靜態內部類只能使用外部類的?

只能使用外部類static修飾的成員變量和成成員方法
靜態內部類可以直接訪問外部類的靜態成員。

代碼演示:

// 身體
public class Body { // 外部類
    static boolean isLive = true;
    public static void walk() {
        System.out.println("人在走路");
    }

    // 成員內部類
    static class Heart { // 內部類
        String color = "黑色";

        public void jump() {
            if (isLive) {
                System.out.println("心臟跳動一下");
                walk();
            } else {
                System.out.println("心臟停止了跳動,涼涼!");
            }
        }
    }
}

測試類:

   public static void main(String[] args) {
        // 外部類名.內部類名 變量名 = new 外部類名.內部類名();
        Body.Heart h = new Body.Heart();
        h.jump();
    }
}

4. 局部內部類

什麼是局部內部類:

局部顧名思義就是,定義在方法中的類

局部內部類的使用:

在定義局部內部類的下面馬上使用

局部內部類的好處:

可以直接使用外部類的成員

public class Chinese {
    String color = "黃色";

    public void eat() {
        // 在方法中的類,局部內部類
        class Chopsticks {
            int length = 80;
            public void use() {
                System.out.println(color + "顏色的人使用長度爲: " + length + "的筷子吃飯");
            }
        }

        // 在定義局部內部類的下面立馬使用
        Chopsticks c = new Chopsticks();
        c.use();
    	}
    }

5.匿名內部類:

什麼是匿名內部類:

沒有名字的內部類

內部類的前提:

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

匿名內部類的格式:

new 接口或者類() {
重寫方法;
}.方法名();

匿名內部類的本質:
四合一

  1. 定義一個沒有名字的類
  2. 這個沒有名字的類實現了前面的接口
  3. 創建了這個沒有名字的類的對象
  4. 對象調用了方法

匿名內部類的好處:

可以簡化接口的使用,代碼更少(不需要有實現類),四合一

匿名內部類的缺點:

匿名內部類沒有名字,只能使用一次

代碼演示:

// 定義一個抽菸接口
public interface Smokeable {
    public abstract void smoking();
}
// 1.定義類實現接口
public class Student implements Smokeable {
    // 2.重寫抽象方法
    @Override
    public void smoking() {
        System.out.println("學生瀟灑的抽菸.");
    }
}

public class Demo09 {
    public static void main(String[] args) {
        // 3.創建實現類對象
        Student s = new Student();
        // Student s1 = new Student();
        // Student s2 = new Student();
        // Student s3 = new Student();
        // Student s4 = new Student();

        s.smoking();
        s.smoking();

        // 使用匿名內部類
        new Smokeable() {
            @Override
            public void smoking() {
                System.out.println("寂寞的抽菸...");
            }
        }.smoking();

        // 如果需要多次調用方法,需要保存這個匿名內部類創建的對象
        // 接口名 變量名 = new 實現類(); 多態
        Smokeable sm = new Smokeable() {
            @Override
            public void smoking() {
                System.out.println("站着抽菸");
            }
        };
        sm.smoking();
        sm.smoking();
        sm.smoking();
    }
}
發佈了49 篇原創文章 · 獲贊 171 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章