黑马程序员技术交流社区

标题: 对象小问题 [打印本页]

作者: 郑雪    时间: 2013-4-28 17:49
标题: 对象小问题
本帖最后由 郑雪 于 2013-5-1 10:28 编辑

对象和引用有什么区别?
比如Person p=new Person();这里的p是一个对象吗?
作者: 绿树林    时间: 2013-4-28 17:58
引用存放在栈中,对象存放在堆中,引用指向对象。
后面new出来的东西叫对象,
new Person()产生一个对象,p是引用,是对象的名字,指向了new Person()出来的对象
作者: 袁梦希    时间: 2013-4-28 18:05
楼主你好:
对象就是说当你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变量就引用了该实体。(指向了该对象)

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

通常情况下,p就是一个对象吧
作者: 付鑫鑫    时间: 2013-4-28 19:24
就好比:
p是你的名字
new Person()是你这个人
在java中,p是对象的引用,为什么要建立引用呢?因为有些对象需要反复操作,比如调方法,
你想,如果不建立引用的话,这个对象只能用一次,这就是匿名对象,后面你会学到.
作者: 董波    时间: 2013-4-28 19:28
本帖最后由 董波 于 2013-4-28 19:33 编辑

我没楼上的几位这么专业,就给你打个比方吧:
把Person p=new Person()比喻成你去银行存钱,new Person()就是你存钱的过程,这个过程结束以后有两个结果:1、你的钱(Person对象)放进了银行(堆);2、银行给了你一张储蓄卡(引用p)。你的钱就是对象,存进银行后你是看不到的;银行就是存储对象的地方,叫作堆;储蓄卡就是对你的钱的引用。虽然你没有随身携带着你的钱(对象),你却可以用储蓄卡(对钱的引用)买东西。也就是我们可以用"储蓄卡"来操作"钱"、用"引用"来操作"对象"、用"p"来操作"实际的Person对象"。
作者: cowthan    时间: 2013-4-28 20:35
都说的太复杂了,对于Person p = new Person()
——p是引用,这个值放在栈中,这个值是个地址,指向一个对象,这个对象在哪儿?
——在堆中,new会在堆中创建一个Person对象,而且会把对象的地址给p

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

所以引用是有作用域的,而对象是没有作用域的,明白不?简单不?
作者: 赵崇友    时间: 2013-4-28 22:55
楼主,估计上面的给你说的都快懵了。很简的的理解,p是引用,相当于指针,里面存的是内存地址值,而这个地址就是new Person()对象在内存中的地址。如果楼主懂堆栈的话,可能理解会容易点。不懂也没关系。记住就行了。以后再深入研究吧。
作者: 芦玉明    时间: 2013-4-28 23:09
我是这样理解的。P在栈内存中,P是指向一个对象,也可以说是引用了一个对象。
作者: HM周磊    时间: 2013-4-28 23:19
其实楼主可以画画图,就像

这样,在结合上面的回答,应该很好理解了
作者: 黑马-秦歌    时间: 2013-4-29 09:46
比如Person p=new Person();这里的p是一个对象吗. 这里 p 不是一个对象 而是 new Person();这才是在堆内存中创建一个新对象 。 而 p 是这个对象的一个引用。说白了就是一个名字。比如java 培训里面有个大师级人物,这个人就是一个对象。 他的名字叫 zxx ,zxx就相当于 p 是对象的一个引用。
作者: 黄玉昆    时间: 2013-4-29 23:52
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
作者: 符立波    时间: 2013-4-30 10:54
P只是一个引用罢了,相当于一个指针........




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