请教一个java关于内存回收的简单问题

来源:百度知道 编辑:UC知道 时间:2024/07/02 19:20:08
我遇到一个题目如下:

//这个问题引用以下类(class)
public class IntObject
{
private int myInt;

public IntObject() //default constructor
{ myInt = 0; }
public IntObject(int n) //constructor
{ myInt = n; }
public void increment() //increment by 1
{ myInt++}
}

这儿有一个用户程序使用以上class

public class IntObjectTest
{
public static IntObject someMethod(IntObject obj)
{
IntObject ans = obj;
ans.increment();
return ans;
}

public static void main(String[] args)
{
IntObject x = new IntObject(2);
IntObject y = new IntObject(7);
IntObject a = y;
x = someMethod(y);
a = someMethod(x);
}
}

运行完毕用户程序以后,x,y,a的值分别是9,9,9,
我看答案,里面说到存储的分派时候

在刚刚要结束 x = someMethod(y);时,
x指向 IntObject myInt (2)

y,a,obj,ans都指向 IntObject myI

IntObject x = new IntObject(2); //新建了一个对象:对象1,引用值传给了x,其实就是对象1的内存地址
IntObject y = new IntObject(7); //新建了一个对象:对象2,引用值传给了y
IntObject a = y; //a=y,把y赋给a,也就是对象2的引用
x = someMethod(y); //y的myInt++,最后又把y传给x,这时x,y指向同一个对象,也就是对象2
a = someMethod(x); //x的myInt++,最后又把x传给a,这时x,a也指向同一个对象,那么x,y,a都指向对象2,对象1因为没有变量来保存它的引用,实际上就成为了废对象,其占有的内存叫做垃圾内存,等待回收

我走了一遍调试:引用"在刚刚要结束 x = someMethod(y);时,
x指向 IntObject myInt (2)",x是IntObject类的对象,存放在栈区,指向堆区的引用,所以x只是一个地址,调用someMethod(y)时,实际上已经让x指向了y所指向的地址,所以 xya指向的是同一个内存单元,所以两次自加之后 值都是9

变量的作用域

,a,obj,ans都指向 IntObject myInt (8)