A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 于潇 中级黑马   /  2012-4-24 15:17  /  2387 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 于潇 于 2012-4-24 23:11 编辑

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

请问,这里的两个Test的区别在哪里?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

12 个回复

倒序浏览
都是同一个对象 下面的那个对象把上面的那个对象给覆盖掉了  比如说你上面的对象里有数据的话 下面的那个对象经过 NEW 之后 成为了一个空对象
此对象 非彼对象
OVER

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
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是一个变量。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
应佳锋 发表于 2012-4-24 15:51
都是同一个对象 下面的那个对象把上面的那个对象给覆盖掉了  比如说你上面的对象里有数据的话 下面的那个对 ...

越说越晕了
回复 使用道具 举报
于潇 发表于 2012-4-24 16:08
越说越晕了

基础没打好  多去看看视频 从头看
回复 使用道具 举报
好吧,我把你问的问题简单再说下:首先你要知道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:11
7#
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:43
8#
认真看一下毕老师画的图就明白了
new一下就是一个新的对象 产生新的地址值
回复 使用道具 举报
第一个test表示一个Test实例的一个引用  
而第二个test 是另一个Test实例的一个引用  覆盖了第一个test的引用
回复 使用道具 举报
孙天 黑马帝 2012-4-24 17:56:15
10#
Test test=new Test();是test进栈,在堆内存中开辟了一个空间,地址指向test,而后test=new Test();是又在堆内存中开辟了一个空间,地址指向了test,代替了之前的地址,相当于覆盖操作,而之前开辟的空间没了指向,变成了垃圾会被垃圾回收机制清理掉
回复 使用道具 举报
先定义了一个Test 的引用test并指向了一个Test对象new Test();
test = new Test();test 重新指向另一个Test对象。
回复 使用道具 举报
应佳锋 发表于 2012-4-24 16:19
基础没打好  多去看看视频 从头看

是啊,我刚看视频没几天
回复 使用道具 举报
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()对象对应的是不同的地址值。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马