for循环中new出同名对象的问题。。。。。求高人解答!!!

littwo 2011-10-29 01:50:29
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的这个对象呢?

小弟新手 求诸位大牛解答呀!
...全文
1305 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
oxcow 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 simonyeung 的回复:]

引用 20 楼 jayyounger 的回复:

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


这里是正解
[/Quote]

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

其实就是创建对象实体,及赋值引用。
SimonYeung 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jayyounger 的回复:]

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

这里是正解
littwo 2011-10-30
  • 打赏
  • 举报
回复
非常感谢大家的帮助 我想我应该是明白了 嗯!
非常感谢!
DaJiangU 2011-10-29
  • 打赏
  • 举报
回复
是这样的 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 只指向第十个
济南大飞哥 2011-10-29
  • 打赏
  • 举报
回复
你要弄明白什么是堆栈!
还有就是基本的java垃圾回收机制。
如果你把new的东西放在一个全局的list里看看他还会不会消失?
对象是对象,引用是引用,引用永远只能指向一个对象。
实际上通过引用找对象是通过对象的地址码找的(据说)。
引用实际上就是指针,java的底层还是C啊
原来缘来 2011-10-29
  • 打赏
  • 举报
回复
变量名只能指向最后new的对象的引用,10个对象前9个已经废了
sfeng1990 2011-10-29
  • 打赏
  • 举报
回复
当然这个实在for循环里 除此之外 就不行了
sfeng1990 2011-10-29
  • 打赏
  • 举报
回复
java可以存在同名对象 你可以在for循环里再加一条语句 System。out.print(getA())
star_splendid 2011-10-29
  • 打赏
  • 举报
回复 3
个人感觉是这样的:
一 首先要理解 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 的命悬一线
。。。。。。


差不多就是这个意思了,个人理解,仅供参考了~
主要是理解明白,变量,对象的生命周期及作用域~就应该很清晰了~
ERP面壁者 2011-10-29
  • 打赏
  • 举报
回复
变量,不是对象,变量并没有同名,只是对象建立了多个,回收了对象。
littwo 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 agan22 的回复:]

引用 9 楼 littwo78168218 的回复:
Java code
class A
{
int i;
public A(int i)
{
this.i = i;
}
}
public class Text2 {

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

楼主要静下心来……
[/Quote]
呵呵是啊 我也这样觉得 我是个学电子专业的学生,只能在课余时间自学java,所以就找的韩顺平老师的视频在自学的,感觉这样比较快。。 看来还是得找本好点的书研究下啊,,
agan22 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 littwo78168218 的回复:]
Java code
class A
{
int i;
public A(int i)
{
this.i = i;
}
}
public class Text2 {

/**
* @param args
*/
public static void main(String[] args) {……
[/Quote]
楼主要静下心来,找一本入门的Java教材好好研读下
littwo 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 scrack 的回复:]

aa是局部变量,只是保存了A对象的一个实例的引用而已!
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
[/Quote]
就是说实际上在堆区new出了10个对象的空间,但是aa这个名字只属于最后一个被new出来的空间。而之前的那几个虽然存在但是不能访问是吧?
24K純帥 2011-10-29
  • 打赏
  • 举报
回复
LZ要知道的变量的作用域
scrack 2011-10-29
  • 打赏
  • 举报
回复
aa是局部变量,只是保存了A对象的一个实例的引用而已!
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
littwo 2011-10-29
  • 打赏
  • 举报
回复
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出的新对象呢?
shaosijun2004 2011-10-29
  • 打赏
  • 举报
回复 1
楼主,你该了解下什么叫引用,什么叫对象 ,还有对象的生命周期
你现在一点概念都没有
龙腾冰 2011-10-29
  • 打赏
  • 举报
回复
想了解这方面的知识,楼主还是看看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语句,得到你想要的那个对象。
likgui 2011-10-29
  • 打赏
  • 举报
回复
a是局部变量,a的生命周期是循环里面
serbry0033 2011-10-29
  • 打赏
  • 举报
回复
aa是局部变量,只是保存了A对象的一个实例的引用而已!
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
加载更多回复(4)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧