![](/img/trans.png)
[英]Why nested class object is still having access to outer class attributes after setting the outer class instance to 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
設置為null
, ob1
仍然具有對它的引用,因此它不會被終結,因此仍然可以訪問。
如果將ob
以及ob1
為null
,則輸出將為:
IC instance finalized
oc instance finalized..
Exception in thread "main" java.lang.NullPointerException
at HelloWorld.main
因為將沒有對ob
或ob1
引用,所以兩個對象都已finalized
。 請注意,它是設置為null的引用 。 其他引用可能仍與ob
一起指向該對象(在您的情況下為ob1
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.