1. 程式人生 > >成員內部類、成員靜態內部類

成員內部類、成員靜態內部類

內部類:成員內部類(特例:靜態內部類)、區域性內部類(匿名內部類)

  1. 成員內部類:定義在外部類當中
    1.定義在外部類當中,和外部類的屬性、方法、構造,處於平等地位。
    2.成員內部類擁有獨立的class檔案,其class檔案的名字規則———外部類的類名+$+內部類的類名
    3.成員內部類可以使用訪問修飾符,使用後的效果和屬性、方法、構造是一樣的
    4.成員內部類內部可以定義各種屬性、構造、方法、初始化塊、甚至可以再定義內部類
    5.成員內部類中的屬性和方法不能是static的

  2. 成員內部類在外部產生物件的語法
    1.外部類 外部類變數名 = new 外部類()
    外部類.內部類 變數名 = 外部類變數名.new 內部類()
    Outer outer = new Outer();
    Outer.Inner inner =outer.new Inner();
    2.外部類.內部類 變數名 = new 外部類().new 內部類()
    Outer.Inner inner = new Outer().new Inner();

  3. 成員內部類操作外部類的屬性或方法:外部類.this.屬性(或方法)

  4. 成員靜態內部類:用static修飾的成員內部類
    1.定義在外部類當中,和外部類的屬性、方法、構造,處於平等地位。
    2.成員靜態內部類擁有獨立的class檔案,其class檔案的名字規則———外部類的類名+$+內部類的類名
    3.成員靜態內部類可以使用訪問修飾符,使用後的效果和屬性、方法、構造是一樣的
    4.成員靜態內部類內部可以定義各種屬性、構造、方法、初始化塊、甚至可以再定義內部類
    5.成員靜態內部類中的屬性和方法可以是static的,與普通成員內部類不同

  5. 成員靜態內部類在外部產生物件的語法
    1.外部類.內部類 變數名 = new 外部類.內部類()
    Outer.Inner inner = new Outer.Inner();
    2.無需產生外部類的物件,直接使用外部類類名。內部類類名的方法作為它的型別,new出來即可

  6. 成員靜態內部類不能操作外部類的非靜態屬性、方法,只能操作外部類中靜態的屬性、方法
    1.內部類的應用場景:我們在描述A事物的時候,發現描述的A事物內部還存在另外一個比較複雜的事物B時候,而且這個比較複雜的事物B還需要訪問A事物的屬性等資料,那麼這個時候我們就可以使用內部類來描述B事物
    2.內部類的好處:內部類可以直接訪問外部類的所有成員
    3.內部類要注意的事項:
    a.如果外部類與內部類存在同名的成員變數時,在內部類中預設情況下是訪問內部類的成員變數。
    解決方法:外部類.this.成員變數名 來指定訪問外部類的成員。示例:Outer.this.print()
    b.私有的成員內部類,只能在外部類提供一個方法建立內部類進行訪問
    c.成員內部類一旦出現了靜態成員,那麼該類也必須使用static進行修飾

訪問方式1示例
class Outer {
    // 成員內部類
    int x = 100;

    class Inner {
        int i = 10;

    public void print() {
        System.out.println("這個是成員內部類的print方法!");
        }
    }

    public void instance() {
        // 在外部的方法中建立了內部類的物件,然後呼叫物件的方法
        Inner inner = new Inner();
        inner.print();
        System.out.println("x = " + this.x);
    }
}

public class Demo12 {

    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.instance();
    }
}
訪問方式2示例
class Outer {
    // 成員內部類
    int x = 100;

    class Inner {
        int i = 10;

    public void print() {
        System.out.println("這個是成員內部類的print方法!");
    }
    }
}

public class Demo12 {

    public static void main(String[] args) {
        Outer.Inner inner = new Outer().new Inner();
        inner.print();
    }
}