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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑雪 中级黑马   /  2013-4-28 17:49  /  1904 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑雪 于 2013-5-1 10:28 编辑

对象和引用有什么区别?
比如Person p=new Person();这里的p是一个对象吗?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

13 个回复

倒序浏览
引用存放在栈中,对象存放在堆中,引用指向对象。
后面new出来的东西叫对象,
new Person()产生一个对象,p是引用,是对象的名字,指向了new Person()出来的对象

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼主你好:
对象就是说当你new的时候在内存开辟了空间,产生了Person对象,有了地址值。
引用就是 指变量 p ,p引用了这个对象的地址值。

顺便给你说一下Person p = new Person();
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
Vehicle veh1 = new Vehicle();
通常把这条语句的动作称之为创建一个对象,其实,它包含了四个动作。
1)右边的“new Vehicle”,是以Vehicle类为模板,在堆空间里创建一个Vehicle类对象(也简称为Vehicle对象)。
2)末尾的()意味着,在对象创建后,立即调用Vehicle类的构造函数,对刚生成的对象进行初始化。构造函数是肯定有的。如果你没写,Java会给你补上一个默认的构造函数。
3)左边的“Vehicle veh1”创建了一个Vehicle类引用变量。所谓Vehicle类引用,就是以后可以用来指向Vehicle对象的对象引用。
4)“=”操作符使对象引用指向刚创建的那个Vehicle对象。

通常情况下,p就是一个对象吧

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
就好比:
p是你的名字
new Person()是你这个人
在java中,p是对象的引用,为什么要建立引用呢?因为有些对象需要反复操作,比如调方法,
你想,如果不建立引用的话,这个对象只能用一次,这就是匿名对象,后面你会学到.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 董波 于 2013-4-28 19:33 编辑

我没楼上的几位这么专业,就给你打个比方吧:
把Person p=new Person()比喻成你去银行存钱,new Person()就是你存钱的过程,这个过程结束以后有两个结果:1、你的钱(Person对象)放进了银行(堆);2、银行给了你一张储蓄卡(引用p)。你的钱就是对象,存进银行后你是看不到的;银行就是存储对象的地方,叫作堆;储蓄卡就是对你的钱的引用。虽然你没有随身携带着你的钱(对象),你却可以用储蓄卡(对钱的引用)买东西。也就是我们可以用"储蓄卡"来操作"钱"、用"引用"来操作"对象"、用"p"来操作"实际的Person对象"。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
都说的太复杂了,对于Person p = new Person()
——p是引用,这个值放在栈中,这个值是个地址,指向一个对象,这个对象在哪儿?
——在堆中,new会在堆中创建一个Person对象,而且会把对象的地址给p

所以如果你听人说java里面都是值传递,你就知道确实如此,因为参数传的都是基本类型或引用,引用是值类型,所以
都是值传递,但引用不像基本类型那样只传进一个值,而是传进一个地址,你拿着这个地址,就可以操作它所指向
的对象,而你对对象的操作就会一直保存在堆中,即使你退出了函数

所以引用是有作用域的,而对象是没有作用域的,明白不?简单不?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼主,估计上面的给你说的都快懵了。很简的的理解,p是引用,相当于指针,里面存的是内存地址值,而这个地址就是new Person()对象在内存中的地址。如果楼主懂堆栈的话,可能理解会容易点。不懂也没关系。记住就行了。以后再深入研究吧。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我是这样理解的。P在栈内存中,P是指向一个对象,也可以说是引用了一个对象。
回复 使用道具 举报
其实楼主可以画画图,就像

这样,在结合上面的回答,应该很好理解了

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
比如Person p=new Person();这里的p是一个对象吗. 这里 p 不是一个对象 而是 new Person();这才是在堆内存中创建一个新对象 。 而 p 是这个对象的一个引用。说白了就是一个名字。比如java 培训里面有个大师级人物,这个人就是一个对象。 他的名字叫 zxx ,zxx就相当于 p 是对象的一个引用。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
P只是一个引用罢了,相当于一个指针........
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马