黑马程序员技术交流社区

标题: 求指点,关于类的引用问题。。。 [打印本页]

作者: 李爱军    时间: 2012-3-14 19:26
标题: 求指点,关于类的引用问题。。。
比如说,我定义了一个Pesson类 创建了一个对象p,然后我对p对象的属性进行修改,我再次引用这个p对象时,我还是引用的原来的p对象么?希望高手能详细解释一下它在内存中的变化?
作者: 段浩亮    时间: 2012-3-14 19:38
你内存中只有一个对象p 无论你怎么修改,还是原来那个对象
在内存中是这样的:在堆内存中有一个对象的实体,它里面有对象的属性,在栈内存中有一个Person类型的p变量,p中存的是对内存中那个对象的地址值,无论你对对象的属性进行怎样的修改p的地址并没有改变所以引用的还是原来的对象,除非你把p指向了另一个对象
作者: 赵孟恩    时间: 2012-3-14 19:46
本帖最后由 赵孟恩 于 2012-3-14 19:48 编辑

class Person
{
         String name;
                 int age;
                 void speak()
           {
                 System.out.println("age = "+ age);
                  }
}
class PersonDemo
{
         public static void main(String[] args)
        {
             Person p = new Person();       //  在堆内存中创建了一个Person对象   栈内存中的p指向该对象    对象内的默认name = null   age = 0
              p.age = 20;                       //在这进行了修改, 就是修改p指向的对象的age, 此刻堆内存中的该Person对象的 name = null  age = 20
             System.out.println(p.age);  //  这里在次调用p.age   在栈内存中p还是指向堆内存中的Person对象  只是改变p指向对象的属性 你已经改变了p指向对象的属性
                                 //当你再次调用p时,p指向的Person对象的属性是你改变后的  

          }
}
要是还是理解不清晰,建议看看毕老师第五天视频,老师已经画图了,很清晰
作者: 李爱军    时间: 2012-3-14 19:50
段浩亮 发表于 2012-3-14 19:38
你内存中只有一个对象p 无论你怎么修改,还是原来那个对象
在内存中是这样的:在堆内存中有一个对象的实体 ...

能用什么方法证实一下么?:loveliness:
作者: 段浩亮    时间: 2012-3-14 20:13
李爱军 发表于 2012-3-14 19:50
能用什么方法证实一下么?

你可以直接打印p 结果是类名+@+hash值   hash值就是对象在内存中的存放位置  你不论怎么修改hash值都是不会变的
作者: 张润政    时间: 2012-3-14 20:21
我们在创建对象的过程中,我们有要在栈内存创建应用,在堆内存创建对象的实体,这个引用就指向了对象实体,记录住了对象在堆内存中的地址。
当你更改P的属性值的时候,你更改的是堆内存中对象实体的内容,并没有改变引用所指向的内存位置。
所以我们用P再去找这个地址的时候就是你更改完属性之后的内容,比如这个对象过了一年,长了一岁,但是没有改变地址,你所找到的人还是他。




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