內部類

N1ce2cu發表於2024-07-13

內部類

  • 一個類定義在另外一個類裡面或者一個方法裡面,這樣的類叫做內部類

成員內部類

package test.InnerClass;

class CSer {
    String weapon;
    private int hp;
    static int money = 800;

    public CSer() {
        // 外部類想要訪問內部類的成員,必須先建立一個成員內部類的物件,再透過這個物件來訪問
        new Weapon().print();
    }

    class Weapon {
        int damage = 80;

        public void print() {
            // 內部類可以隨心所欲地訪問外部類的成員
            System.out.println(hp);
            System.out.println(money);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        // 在靜態方法中訪問成員內部類的時候,就必須先得建立一個外部類的物件,因為內部類是依附於外部類的
        CSer cSer = new CSer();
        CSer.Weapon weapon = cSer.new Weapon();
        weapon.print();
    }
}

區域性內部類

class Weapon {
    public Weapon print() {
        // 區域性內部類是定義在一個方法或者一個作用域裡面的類,所以區域性內部類的生命週期僅限於作用域內。
        class AWP extends Weapon {
            private int damage = 80;
        }
        return new AWP();
    }
}
  • 區域性內部類就好像一個區域性變數一樣,它是不能被許可權修飾符修飾的,比如說 public、protected、private 和 static 等。

匿名內部類

public class ThreadDemo {
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName());
            }
        });
        t.start();
    }
}
  • 匿名內部類的作用主要是用來繼承其他類或者實現介面,並不需要增加額外的方法,方便對繼承的方法進行實現或者重寫。
  • 匿名內部類是唯一一種沒有構造方法的類。

靜態內部類

class CSer {
    String weapon;
    private int hp;
    static int money = 800;

    public CSer() {
        new Weapon().print();
    }

    // 靜態內部類和成員內部類類似,只是多了一個static關鍵字。
    static class Weapon {
        int damage = 80;

        public void print() {
            // 由於static關鍵字的存在,靜態內部類是不允許訪問外部類中非static的變數和方法的
            System.out.println(money);
        }
    }
}

內部類特性

  • 1、內部類可以使用多個例項,每個例項都有自己的狀態資訊,並且與其他外圍物件的資訊相互獨立。
  • 2、在單個外部類中,可以讓多個內部類以不同的方式實現同一個介面,或者繼承同一個類。
  • 3、建立內部類物件的時刻並不依賴於外部類物件的建立。
  • 4、內部類並沒有令人迷惑的“is-a”關係,他就是一個獨立的實體。
  • 5、內部類提供了更好的封裝,除了該外圍類,其他類都不能訪問。

相關文章