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的这个对象呢?
小弟新手 求诸位大牛解答呀!
[解决办法]
括号里面的代码是一个周期,你运行完了,它也就没有存在的意义了,会被垃圾回收器收掉。
[解决办法]
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要知道的变量的作用域
[解决办法]
第一次循环 产生一个 一个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 只指向第十个
[解决办法]