关于引用的问题

在牛客网上,看到一道简单的关于对象内存引用的小问题。觉得挺经典的。

这是题目:

public class Test {
    public static class A {
        private B ref;
        public void setB(B b) {
            ref = b;
        }
    }
    public static Class B {
        private A ref;
        public void setA(A a) {
            ref = a;
        }
    }
    public static void main(String args[]) {
    …
        start();
    ….
    }
    public static void start() { A a = new A();
        B b = new B();
        a.setB(b);
        b = null; //
        a = null;
    …
    }
}

	

给出的答案:

A:b = null执行后b可以被垃圾回收
B:a = null执行后b可以被垃圾回牧
C:a = null执行后a可以被垃圾回收
D:a , b必须在整个程序结束后才能被垃圾回收
E:类A和类B在设计上有循环引用,会导致内存泄露
F:a, b 必须在start方法执行完毕才能被垃圾回收

正确答案BC

关于引用的问题_第1张图片

通过画图可知,上述代码中对象a有对对象b的引用。所以根据可达性分析。如果a和b都能够被垃圾回收时,需要将a=null。说明BC是正确的。相对应的ADF就是错误的。

在图上也可以看出来,仅有,类A对类B的引用,没有类B对类A的引用,所以并没有造成循环引用。

你可能感兴趣的:(java,开发语言)