关于垃圾回收,,如何理解。。请各位大大指教
下述代码中,执行完语句1后,b是否会被回收?
import java.util.*;
public class Stack
{
private Object[] elements;
private int size = 0;
public Stack(int initialCapacity)
{
this.elements = new Object[initialCapacity];
}
public void push(Object e)
{
ensureCapacity();
elements[size++] = e;
}
public Object pop()
{
if (size == 0)
throw new EmptyStackException();
return elements[--size];
}
private void ensureCapacity()
{
if (elements.length == size)
{
Object[] oldElements = elements;
elements = new Object[2 * elements.length + 1];
System.arraycopy(oldElements, 0, elements, 0, size);
}
}
public static void main(String[] args)
{
Stack stack=new Stack(10);
Integer i=new Integer(10);
stack.push(i);
Object b=stack.pop();
b=null; /////////////////语句1
}
}
A. 可以
B. 不可以
------解决方案--------------------楼主很高兴回答你的问题: java中对象的销毁 被java虚拟机视为垃圾的对象主要包括两种 一种对象引用超出其作用范围 2就是 给对象赋值null 就是你题目中的 值得注意一点是垃圾回收只能回收由new创建的对象。 而且虚拟机何时回收我们程序员也不知道
------解决方案-------------------- A 可以。 就是不确定垃圾回收器什么时候回收。
出题人想迷惑人么?
------解决方案--------------------个人浅见:
不会回收. 题目中的b 只是指向elements对象数组的最后一个对象的引用。b=null语句只是让b不再指向那个对象了,但那个对象还在。(elements 还存在)。
比如:
Object a1,b1;
a1=new Object(); //a1 指向那个new出来的对象。
b1=a1; //b1 也指向那个对象。
b1=null; //b1不指向那个对象了,但a1还指向那个对象。所以对象不会回收。
------解决方案--------------------就想windows的消息循环,你要操作的消息命令发给windows,但是何时执行是无法确定,但是只要windows不死机消息最终会被执行。
------解决方案--------------------关键是问题里问b会不会回收,,个人理解它都不占内存,,回收啥。。
我也这么认为.
------解决方案--------------------