首頁 > 軟體

深入瞭解Java內部類的用法

2022-07-18 14:03:43

1.內部類分類和概念

java類的五大成員:屬性,方法,構造器(構造方法),程式碼塊,內部類

內部類的分類:

定義在外部類區域性的位置(比如方法內):

  • 區域性內部類(有類名)
  • 匿名內部類(無類名)

定義在外部類成員位置上:

  • 成員內部類(沒有static修飾)
  • 靜態內部類(有static修飾)

概念:在一個類的內部再定義一個完整的類,也會生成一個class檔案

程式碼範例:

/**
 * 內部類
 */
public class InnerClass {
    private int n = 521;

    public InnerClass(int n) {
        this.n = n;
    }

    class Inner { // 內部類

    }
}

謹記:內部類很重要,java底層原始碼內部類使用場景很多!

2.區域性內部類

class Outer001 { // 外部類
    private int n = 521;
    private void kaka() {
        System.out.println("我是外部類的方法!");
    }
    public void show() {
        // 區域性內部類定義在外部類的區域性位置,通常在方法中
        class Inner001 {
            // 區域性內部類
            public void f() {
                // 可以直接存取外部類的所有成員,包含私有的
                System.out.println(n);
            }
        }
    }
}

不能新增存取修飾符,但是可以新增final

區域性內部類的作用域只在定義它的方法或者程式碼塊中

外部類使用內部類的方法,直接new即可:

public void show() {
    // 區域性內部類定義在外部類的區域性位置,通常在方法中
    final class Inner001 {
        // 區域性內部類
        public void f() {
            // 可以直接存取外部類的所有成員,包含私有的
            System.out.println(n);
            kaka();
        }
    }
    // 外部類使用內部類的方法
    Inner001 inner001 = new Inner001();
    inner001.f();
}

外部其他類不能存取區域性內部類!

外部類和區域性內部類的成員重名時,預設遵循就近原則,如果想要存取外部類的成員,使用外部類名.this.成員進行存取

3.匿名內部類(重要)

匿名內部類其實有名字,它的名字是底層的JDK給分配的~系統分配該類名的時候會在外部類的基礎上加上$1,存在多個內部類的,$後面的值進行遞增

基於介面的匿名內部類

/**
 * 匿名內部類
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        Outer002 outer002 = new Outer002();
        outer002.method();
    }
}

class Outer002 {
    private int n = 521;

    public void method() {
        // 基於介面的匿名內部類
        // tiger的編譯型別是IA,執行型別就是匿名內部類!
        // 系統分配該類名的時候會在外部類的基礎上加上$1,此處是Outer002$1
        // JDK底層在建立了匿名內部類之後,立即建立了一個範例,並且把地址返回給tiger
        IA tiger = new IA() {
            @Override
            public void cry() {
                System.out.println("我是一隻小老虎

IT145.com E-mail:sddin#qq.com