黑马程序员技术交流社区

标题: 有个问题一直想不通<已解决> [打印本页]

作者: 于潇    时间: 2012-4-24 15:17
标题: 有个问题一直想不通<已解决>
本帖最后由 于潇 于 2012-4-24 23:11 编辑

public class Test {
public static void main(String[] args) {
Test test=new Test();
test=new Test();
}
}

请问,这里的两个Test的区别在哪里?
作者: 应佳锋    时间: 2012-4-24 15:51
都是同一个对象 下面的那个对象把上面的那个对象给覆盖掉了  比如说你上面的对象里有数据的话 下面的那个对象经过 NEW 之后 成为了一个空对象
此对象 非彼对象
OVER
作者: 龚正军    时间: 2012-4-24 16:05
public class Test {
public static void main(String[] args) {
Test test=new Test();
test=new Test();
}
}

首先这2给test,是完全不同的,我们具体分析,这涉及到2给大问题!!
第一你建立了一个public class Test{}  ,这是Test类。(是对Test对象共性描述的类)
然后你Test test=new Test();
这段代码我们分开看,你估计就清楚了,首先:你Test test;你声明了一个变量test为Test类的一个变量,然后你把这个变量赋值与了一个新值:new Test();(这是一个新建立的对象)
于是:你把new Test();这个对象赋值给了test这个变量(内存中也就是test指向了new Test();这个对象);
第二:test=new Test();
你声明的Test类变量test又指向了新的一个对象这个对象是:new Test();,也就是你test获得了新值!!!(之前你建立的那个new Test();过段时间在内存中没有使用到,被jvm自动清除掉了。这个是新的)

也就是说第一个new Test();和第二个new Test();是内存中地址完全不同的2个对象。

最后Test是一个类,test是一个变量。

作者: 于潇    时间: 2012-4-24 16:08
应佳锋 发表于 2012-4-24 15:51
都是同一个对象 下面的那个对象把上面的那个对象给覆盖掉了  比如说你上面的对象里有数据的话 下面的那个对 ...

越说越晕了
作者: 应佳锋    时间: 2012-4-24 16:19
于潇 发表于 2012-4-24 16:08
越说越晕了

基础没打好  多去看看视频 从头看
作者: 龚正军    时间: 2012-4-24 16:21
好吧,我把你问的问题简单再说下:首先你要知道Test是你建立的一个类(就是class)你通过这句话建立的:public class Test{}
然后你又声明了一个变量test,这个变量被你声明为属于Test这个类的变量。


--------------其实不想割-------------------以上你明白了,然后你再需要知道就是:(如果上面2句话都没明白,就不用看下面了)


Test test=new Test();-----------第一个对象
test=new Test();-------------第二个对象
这2句话,都是新建一个对象:new Test();但是你只声明了一个变量test,你开始把变量test使用了(指向)第一个对象,后来你说你不想要第一个对象了,你就把第一个对象仍了,有把变量test使用了(指向)第二个对象。
第一个对象就没了。(你要知道第一个对象和第二个对象是不同的2个东西)

作者: 李斌    时间: 2012-4-24 16:34
public class Test {
public static void main(String[] args) {
Test test=new Test();  
test=new Test();
}
第一个new 产生的结果是在堆内存中开辟了一个空间 用于存放对象A 并将对象在内存中的地址值a(用a表示)赋给了test
第二个 test=new Test() 看右边 意思是 在堆内存中建立了一个新的对象B 看左边 新对象B将地址值b(用b表示)赋给了test变量 使得它指向B;
这样 test变量的值就发生了改变,由a变为b 即只指向了对象B,此时A对象没有被引用 成为垃圾,由java的垃圾回收机制清理
注意 对象B和A是不同的,他们有不同的内存地址值!
后话:楼主的头像有点小邪恶 嘿嘿~~{:soso_e113:}

}

作者: 李斌    时间: 2012-4-24 16:35
认真看一下毕老师画的图就明白了
new一下就是一个新的对象 产生新的地址值
作者: 崔仁军    时间: 2012-4-24 17:34
第一个test表示一个Test实例的一个引用  
而第二个test 是另一个Test实例的一个引用  覆盖了第一个test的引用
作者: 孙天    时间: 2012-4-24 17:56
Test test=new Test();是test进栈,在堆内存中开辟了一个空间,地址指向test,而后test=new Test();是又在堆内存中开辟了一个空间,地址指向了test,代替了之前的地址,相当于覆盖操作,而之前开辟的空间没了指向,变成了垃圾会被垃圾回收机制清理掉
作者: 韩新凯    时间: 2012-4-24 18:05
先定义了一个Test 的引用test并指向了一个Test对象new Test();
test = new Test();test 重新指向另一个Test对象。
作者: 于潇    时间: 2012-4-24 18:15
应佳锋 发表于 2012-4-24 16:19
基础没打好  多去看看视频 从头看

是啊,我刚看视频没几天
作者: 魏征    时间: 2012-4-24 19:40
public class Test {
public static void main(String[] args) {
Test test=new Test();
test=new Test();
}
}
Test test=new Test();建立了一个Test对象,在盏内存中开辟了一个空间分配了一个地址值,变量test指向了这个地址值。
test=new Test();这时又建立了一个新的Tset对象,在盏内存中另外开辟了一个空间分配地址值,将变量test指向了这个新的Test对象地址值。
两个newTest()对象对应的是不同的地址值。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2