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的这个对象呢?小弟新手 求诸位大牛解答呀!
{
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的这个对象呢?小弟新手 求诸位大牛解答呀!
解决方案 »
- 点击注册按钮为啥没反应呢?
- 文本框中信息的比较
- DatabaseMetaData.getTables()怎样过滤系统表
- 让人疑惑的IO问题
- 如何将存储在内存中的数据结构直接导出到硬盘上?
- nio里,怎么将FloatBuffer 类型转为ByteBuffer 类型??
- 安装JBUILDER 失败。我是从Borland网站上下载的,系统时Windows2003,错误信息如下
- 布局管理器 相关问题???
- tomcat运行不行,是在编写完之后,view窗口中不能预览?
- 【Java------能解决这个问题吗???】
- 关于List 和 Set 的疑问点
- 一道很有意思的笔试题:继承中关于super的相关问题
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];
}
}
这和楼主的做法一样的吧?
我的理解是 new出来的 就是一个对象 不可能会重复。
但是 你用了for循环 for结束以后 才是真正的对象
中间的过程中产生的对象都是假的。
根据这个for在实际中的结果 才能确定最终会创建出什么对象。初学java 理解不对的地方 还请大家多多指教。orz
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对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语句,得到你想要的那个对象。
{
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出的新对象呢?
当aa离开作用域就不存在了,假设垃圾回收器没有运行的话,之前new出来的对象是在堆内存中的
只是程序中没有对它的直接或者间接引用,就是对A的实例没有可见性!
一 首先要理解 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垃圾回收机制。
如果你把new的东西放在一个全局的list里看看他还会不会消失?
对象是对象,引用是引用,引用永远只能指向一个对象。
实际上通过引用找对象是通过对象的地址码找的(据说)。
引用实际上就是指针,java的底层还是C啊
例如 Map map = new HashMap();
for(int i =0 ; i<10 ;i++){
AA aa = new AA(i);
map.put(""+i , aa);
}
map里面放了这十个对象 但aa 只指向第十个
第一次循环创建了对象new A(1),aa指向new A(1)在对象内存中的地址(引用)。
第二次循环创建了对象new A(2),让后移动aa的指针,使其指向new A(2)对象在内存中的地址(引用)。此时new A(1)还保存在内存中,当下一次GC的时候,检测该对象是否被引用,如果没有就GC掉。
其实就是创建对象实体,及赋值引用。