日期:2014-05-20  浏览次数:20890 次

关于垃圾回收,,如何理解。。请各位大大指教
下述代码中,执行完语句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会不会回收,,个人理解它都不占内存,,回收啥。。
我也这么认为.
------解决方案--------------------
探讨

引用:
个人浅见:
不会回收. 题目中的b 只是指向elements对象数组的最后一个对象的引用。b=null语句只是让b不再指向那个对象了,但那个对象还在。(elements 还存在)。
比如:
Object a1,b1;
a1=new Object(); //a1 指向那个new出来的对象。
b1=a1; //b1 也指向那个对象。
b1=null; //b1……