class A
{
int x;
A(int i)
{
x=i;
}
A method1()
{
A aTemp=new A(x+10);
return aTemp;
}
}class Test9
{
public static void main(String args[])
{
A a1=new A(0);
  A a2=new A(0);
a1=a2.method1();
System.out.println("a1.x="+a1.x);
a2=a1.method1();
System.out.println("a2.x="+a2.x);
a1=a2.method1();
System.out.println("a1.x="+a1.x);
a2=a1.method1();
System.out.println("a2.x="+a2.x);
}
}
上面method1()返回一个临时对象,当赋给a1时,a1就是这个临时对象的引用了吗?那原来a1的内存是不是就自动回收了?那反复调用method1()赋值的话a1和a2的地址是不是一直在变?原来学过C++,刚一接触java对于这类的对象引用不是很清楚,尤其是java的自动内存回收,希望有高手给解释一下,最好系统点。对了,顺便问下java中是不是不能得到变量或者对象的地址的?

解决方案 »

  1.   

    重新把程序写清楚点class A 

        int x; 
        A(int i) 
        { 
            x=i; 
        } 
        A method1() 
        { 
            A aTemp=new A(x+10); 
            return aTemp; 
        } 
    } class Test9 

        public static void main(String args[]) 
        { 
            A a1=new A(0); 
            A a2=new A(0); 
            a1=a2.method1(); 
            System.out.println("a1.x="+a1.x); 
            a2=a1.method1(); 
            System.out.println("a2.x="+a2.x); 
            a1=a2.method1(); 
            System.out.println("a1.x="+a1.x); 
            a2=a1.method1(); 
            System.out.println("a2.x="+a2.x); 
        } 

      

  2.   

    对,a1是临时对象的引用,指向了临时对象的地址
    a1原来指向的对象如果没有引用指向的话是会自动回收的,但是GC什么时候来回收就不知道了,
    反复赋值地址会变,因为你每次都是产生了新的对象,然后将a1和a2指向这个新对象
    java中只能得到对象的hashcode,可以认为作用和地址一样,但它不是真实的物理地址,应该是处于JVM管理下的地址