靜態內部類和非靜態內部類的區別

package com.devin;

public class MyMain{
    private static String name = "woobo";
    private String num = "X001";
 
    // 靜態內部類可以用public,protected,private修飾
    static class Person {
        // 靜態內部類中可以定義靜態或者非靜態的成員
        private String address = "China";

        private static String x = "as";
        public String mail = "[email protected]";// 內部類公有成員

        public void display() {
            // System.out.println(num);//不能直接訪問外部類的非靜態成員

            // 靜態內部類不能訪問外部類的非靜態成員(包括非靜態變量和非靜態方法)
            System.out.println(name);// 只能直接訪問外部類的靜態成員

            // 靜態內部類只能訪問外部類的靜態成員(包括靜態變量和靜態方法)
            System.out.println("Inner " + address);// 訪問本內部類成員。
        }
    }

    public void printInfo() {
        Person person = new Person();

        // 外部類訪問內部類的非靜態成員:實例化內部類即可
        person.display();

        // System.out.println(mail);//不可訪問
        // System.out.println(address);//不可訪問
        System.out.println(person.address);// 可以訪問內部類的私有成員

        System.out.println(Person.x);// 外部類訪問內部類的靜態成員:內部類.靜態成員
        System.out.println(person.mail);// 可以訪問內部類的公有成員
    }

    public static void main(String[] args) {
        MyMain staticTest = new MyMain();
        staticTest.printInfo();
    }
}


說明:“靜態內部類”與“嵌套類”概念上等價;“非靜態內部類”與“內部類”概念上等價。

1. 嵌套類的對象,並不需要其外圍類的對象。 即它可以不依賴於外部類實例被實例化。

2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。 這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定

3. 外部類訪問內部類的的成員有些特別, 不能直接訪問, 但可以通過內部類實例來訪問, 這是因爲靜態嵌套內的所有成員和方法默認爲靜態的了.同時注意, 內部靜態類Person只在類StaticTest 範圍內可見, 若在其它類中引用或初始化, 均是錯誤的.
4 . 靜態內部類可以有靜態成員,而非靜態內部類則不能有靜態成員。 
5. 靜態內部類的非靜態成員可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;

6 . 非靜態內部類的非靜態成員可以訪問外部類的非靜態變量。

    生成一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成爲了一個頂級類(正常情況下,你不能在接口內部放置任何代碼,但嵌套類可以作爲接口的一部分,因爲它是static 的。只是將嵌套類置於接口的命名空間內,這並不違反接口的規則)



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