读书人

for循环中new出同名对象的有关问题。求

发布时间: 2012-01-12 22:11:58 作者: rapoo

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类的对象


第一次循环 产生一个 一个A类的对象(姑且叫他 A1),被 局部变量 aa 引用,循环结束,aa 结束生命,A1现在还活着(还能活一回?或者死掉了 要看GC的实现机制 了~),
第二次循环 同样产生一个 A类的对象这回叫 做A2 ,被 新的一个局部变量 也叫aa 引用,循环结束,aa 结束生命,A2 的命悬一线
。。。。。。


差不多就是这个意思了,个人理解,仅供参考了~
主要是理解明白,变量,对象的生命周期及作用域~就应该很清晰了~
[解决办法]
java可以存在同名对象 你可以在for循环里再加一条语句 System。out.print(getA())
[解决办法]
当然这个实在for循环里 除此之外 就不行了
[解决办法]
变量名只能指向最后new的对象的引用,10个对象前9个已经废了
[解决办法]
你要弄明白什么是堆栈!
还有就是基本的java垃圾回收机制。
如果你把new的东西放在一个全局的list里看看他还会不会消失?
对象是对象,引用是引用,引用永远只能指向一个对象。
实际上通过引用找对象是通过对象的地址码找的(据说)。
引用实际上就是指针,java的底层还是C啊

[解决办法]
是这样的 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 只指向第十个
[解决办法]

探讨

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

[解决办法]
探讨

引用:

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


这里是正解

读书人网 >J2SE开发

热点推荐