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

for循环中new出同名对象的问题。。。。。求高人解答!!!
class A
{
private int a;
public A(int a)
{
this.a = a;
}
}
public class Text
{
public static void main(String args[])
{
for(int i=1; i<=10; i++)
{
A aa = new A(i);
}
}
}

上面的代码能编译能运行,new出了10个名叫aa的对象,java中应该不能有同名的对象的吧,为什么这样可以呢?这个程序执行完毕之后是存在10个名叫aa,但成员变量i值不通的对象,还是每次循环都会释放掉上一个循环中创建的对象,重新创建,最终只剩下i = 10的这个对象呢?

小弟新手 求诸位大牛解答呀!

------解决方案--------------------
括号里面的代码是一个周期,你运行完了,它也就没有存在的意义了,会被垃圾回收器收掉。
------解决方案--------------------
探讨
这个程序执行完毕之后是存在10个名叫aa,但成员变量i值不通的对象,还是每次循环都会释放掉上一个循环中创建的对象,重新创建,最终只剩下i = 10的这个对象呢?

------解决方案--------------------

public static void main(String args[]) {
for (int i = 1; i <= 10; i++) {
A aa = new A(i);
}

for (int j = 1; j <= 10; j++) {
String a[] = new String[j];
}
}

------解决方案--------------------
String a[] = new String[j];
这和楼主的做法一样的吧?
我的理解是 new出来的 就是一个对象 不可能会重复。
但是 你用了for循环 for结束以后 才是真正的对象
中间的过程中产生的对象都是假的。
根据这个for在实际中的结果 才能确定最终会创建出什么对象。

初学java 理解不对的地方 还请大家多多指教。orz
------解决方案--------------------
aa是局部变量,只是保存了A对象的一个实例的引用而已!
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
------解决方案--------------------
a是局部变量,a的生命周期是循环里面
------解决方案--------------------
想了解这方面的知识,楼主还是看看think in java 吧,关于你的问题。你可以看看我下面的一段代码:
Java code
package Char06;

class A {
    private int a;

    public A(int a) {
        this.a = a;
    }
    public int getA(){
        return this.a;
    }
    public void finalize() throws Throwable{
        System.out.println("对象被释放"+this.getA());
    }
};

public class Text {
    public static void main(String args[]) {
        A aa = null;
        for (int i = 1; i <= 10; i++) {
            aa = new A(i);
        }
        System.gc();
    }
}

------解决方案--------------------
楼主,你该了解下什么叫引用,什么叫对象 ,还有对象的生命周期
你现在一点概念都没有
------解决方案--------------------
aa是局部变量,只是保存了A对象的一个实例的引用而已!
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
------解决方案--------------------
LZ要知道的变量的作用域
------解决方案--------------------
探讨
Java code
class A
{
int i;
public A(int i)
{
this.i = i;
}
}
public class Text2 {

/**
* @param args
*/
public static void main(String[] args) {……

------解决方案--------------------
变量,不是对象,变量并没有同名,只是对象建立了多个,回收了对象。
------解决方案--------------------
个人感觉是这样的:
一 首先要理解 A aa = new A(1);的含义,这句话包含的三个步骤
1. 首先 new A(i) ,代表 在堆中产生一个A的对象(没有名字)
2. A aa 是在栈中 产生一个引用 
3. 将aa 指向 堆中的 1步骤中产生的对象。
 
这个理解完了,就可以进行下一步理解了,

二 就是局部变量aa的生命周期的问题,每次执行for循环的代码段,是在栈中完成 ,每一次的aa的生命周期都仅仅局限于 一次for循环,也就是aa 的作用于仅仅是在for循环体里面 。
也就是说你的for循环不断生成了10个aa,不过他们的命都很短。

三 for循环 其实也产生了10个 A类的对象