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的这个对象呢?小弟新手   求诸位大牛解答呀!

解决方案 »

  1.   


       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];
          }
       }
      

  2.   

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

  3.   

    aa是局部变量,只是保存了A对象的一个实例的引用而已!
    当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
    只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
      

  4.   

    想了解这方面的知识,楼主还是看看think in java 吧,关于你的问题。你可以看看我下面的一段代码: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();
    }
    }
    运行结果:10
    对象被释放9
    对象被释放8
    对象被释放7
    对象被释放6
    对象被释放5
    对象被释放4
    对象被释放3
    对象被释放2
    对象被释放1
    你定义的是局部变量,所以不用了就清理了,你把aa定义为全局变量,你看看最终把其他的对象都清理了,只保留了最后一个,你也可以在for循环中加入break语句,得到你想要的那个对象。
      

  5.   

    class A
    {
    int i;
    public A(int i)
    {
    this.i = i;
    }
    }
    public class Text2 { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    A aa = new A(1);
    A aa = new A(2);
    }}
    我实验了一下,发现是不能够同时创建多个名字相同的对象的。。
    这样是不是说明for循环中每循环一次就是放掉了上一次new出的新对象呢?
      

  6.   

    aa是局部变量,只是保存了A对象的一个实例的引用而已!
    当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
    只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
      

  7.   

    就是说实际上在堆区new出了10个对象的空间,但是aa这个名字只属于最后一个被new出来的空间。而之前的那几个虽然存在但是不能访问是吧?
      

  8.   

    楼主要静下心来,找一本入门的Java教材好好研读下
      

  9.   

    呵呵是啊   我也这样觉得  我是个学电子专业的学生,只能在课余时间自学java,所以就找的韩顺平老师的视频在自学的,感觉这样比较快。。  看来还是得找本好点的书研究下啊,,    
      

  10.   

    个人感觉是这样的:
    一    首先要理解  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类的对象
    第一次循环 产生一个 一个A类的对象(姑且叫他 A1),被 局部变量 aa 引用,循环结束,aa 结束生命,A1现在还活着(还能活一回?或者死掉了 要看GC的实现机制 了~),
    第二次循环 同样产生一个 A类的对象这回叫 做A2 ,被 新的一个局部变量 也叫aa 引用,循环结束,aa 结束生命,A2 的命悬一线

    差不多就是这个意思了,个人理解,仅供参考了~
    主要是理解明白,变量,对象的生命周期及作用域~就应该很清晰了~
      

  11.   

    java可以存在同名对象 你可以在for循环里再加一条语句 System。out.print(getA())
      

  12.   

    当然这个实在for循环里 除此之外 就不行了
      

  13.   

    变量名只能指向最后new的对象的引用,10个对象前9个已经废了
      

  14.   

    你要弄明白什么是堆栈!
    还有就是基本的java垃圾回收机制。
    如果你把new的东西放在一个全局的list里看看他还会不会消失?
    对象是对象,引用是引用,引用永远只能指向一个对象。
    实际上通过引用找对象是通过对象的地址码找的(据说)。
    引用实际上就是指针,java的底层还是C啊
      

  15.   

      是这样的 for 循环一次就要new 一个对象 但是aa 变量最终是指向最后一次new 出来的 ,循环完毕 这是个对象依然在内存里面,只有当所在的方法结束了 ,这是才能等等垃圾回收器 回收释放内存
       例如 Map map = new HashMap();
    for(int i =0 ; i<10 ;i++){
    AA aa = new AA(i);
    map.put(""+i , aa);
     }
    map里面放了这十个对象 但aa 只指向第十个
      

  16.   


    第一次循环创建了对象new A(1),aa指向new A(1)在对象内存中的地址(引用)。
    第二次循环创建了对象new A(2),让后移动aa的指针,使其指向new A(2)对象在内存中的地址(引用)。此时new A(1)还保存在内存中,当下一次GC的时候,检测该对象是否被引用,如果没有就GC掉。
    其实就是创建对象实体,及赋值引用。