簡體   English   中英

將外部類實例設置為null,但內部類實例仍可以訪問外部類的字段。 怎么樣?

[英]Setting outer class instance to null, and yet inner class instances is able to access outer class's field. How?

考慮以下代碼:

class OuterClass{
    String ocs="ocs";
    class InnerClass{
        String ics="ics";
        void innerMeth(){
            System.out.println(ocs);
        }
    }
}
//main class
public class HelloWorld{
    public static void main(String []args){
        OuterClass ob=new OuterClass();
        OuterClass.InnerClass ob1=ob.new InnerClass();
        ob=null;
        ob1.innerMeth();
    }
}

仍然打印出字符串'ocs'。
基本上,即使我將OuterClass實例設置為null。
InnerClass情況下仍然可以訪問OuterClass參考的領域ocs
怎么樣 ?

這和閉包有關嗎? 也就是說,即使在上下文不再存在的情況下,也要在上下文中維護變量,在這種情況下是OuterClass對象。

創建內部類時,InnerClass會保留自己對外部類的引用。 如果對外部類的引用為空,則這與內部類所維護的引用無關。 請參閱Java語言參考

O類的直接內部類C的實例i與O實例相關聯,稱為i的直接封閉實例。 創建對象時立即確定對象的直接封閉實例(第15.9.2節)。

您要更新的只是對實例的引用,而不是實例本身。 引用只是指向其他內容的事物。

可以將其想像成手機中的“聯系人”-您正在存儲朋友的電話號碼,以便可以撥打他們的電話; 從您的聯系人中刪除他們的電話號碼不會使他們的電話消失。

向每個類添加finalize()方法將提供更好的理解。

 class OuterClass {
    protected void finalize() throws Throwable {
        System.out.println("oc instance finalized..");
    };
    String ocs = "ocs";

class InnerClass {
    String ics = "ics";

    protected void finalize() throws Throwable {
        System.out.println("IC instance finalized");
    };

    void innerMeth() {
        System.out.println(ocs);
    }
}

}

// main class
class HelloWorld {
    public static void main(String[] args) {
        OuterClass ob = new OuterClass();
        OuterClass.InnerClass ob1 = ob.new InnerClass();
        ob = null;
        // ob1=null;
        System.gc();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ob1.innerMeth(); // you will get NPE here
    }
}

當只有ob設置為nullob1仍然具有對它的引用,因此它不會被終結,因此仍然可以訪問。

如果將ob以及ob1null ,則輸出將為:

 IC instance finalized
oc instance finalized..
Exception in thread "main" java.lang.NullPointerException
    at HelloWorld.main

因為將沒有對obob1引用,所以兩個對象都已finalized 請注意,它是設置為null的引用 其他引用可能仍與ob一起指向該對象(在您的情況下為ob1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM