在将外部类实例设置为null之后,为什么嵌套类对象仍然可以访问外部类属性?

时间:2019-01-19 22:37:00

标签: java nested garbage-collection

我有以下代码:

public class EnclosingClass {
    public int age; 
    public int height ; 
    class Job {
        public String dateBegin ; 
        public int yearsExperience;
        public void displayCompleteProfile() {
            System.out.println(toString()+" age : "+age+" height : "+height);
        }
        @Override
        public String toString() {
            return "Job [dateBegin=" + dateBegin + ", yearsExperience=" + yearsExperience + "]";
        }


    } 

    @Override
    public String toString() {
        return "EnclosingClass [age=" + age + ", height=" + height + "]";
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        EnclosingClass enClass = new EnclosingClass();
        enClass.age = 20; 
        enClass.height = 170;           
        EnclosingClass.Job job1 = enClass.new Job();
        job1.dateBegin = "12/12/2008";
        job1.yearsExperience = 5;

        job1.displayCompleteProfile();
        enClass = null;
        job1.displayCompleteProfile();

    }

}  

执行代码时,我得到以下结果:

  

工作[dateBegin = 12/12/2008,yearsExperience = 5]年龄:20身高:170
  工作[dateBegin = 12/12/2008,yearsExperience = 5]年龄:20身高:170

即使我将对象设置为null,嵌套类对象 job1 为何仍然可以访问其封闭的类实例 enClass 属性?

1 个答案:

答案 0 :(得分:2)

当您拥有一个非静态的嵌套类时,该类的所有实例将自动包含包含该类的外部类的实例。

在这种情况下,即使您设置了enClass = null,仍然有job1对其的引用。因为存在该引用,所以即使您不能再直接访问它,也无法进行垃圾回收。