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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李爱军 中级黑马   /  2012-3-14 19:26  /  1775 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

比如说,我定义了一个Pesson类 创建了一个对象p,然后我对p对象的属性进行修改,我再次引用这个p对象时,我还是引用的原来的p对象么?希望高手能详细解释一下它在内存中的变化?

5 个回复

倒序浏览
你内存中只有一个对象p 无论你怎么修改,还是原来那个对象
在内存中是这样的:在堆内存中有一个对象的实体,它里面有对象的属性,在栈内存中有一个Person类型的p变量,p中存的是对内存中那个对象的地址值,无论你对对象的属性进行怎样的修改p的地址并没有改变所以引用的还是原来的对象,除非你把p指向了另一个对象

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 赵孟恩 于 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对象的属性是你改变后的  

          }
}
要是还是理解不清晰,建议看看毕老师第五天视频,老师已经画图了,很清晰

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
段浩亮 发表于 2012-3-14 19:38
你内存中只有一个对象p 无论你怎么修改,还是原来那个对象
在内存中是这样的:在堆内存中有一个对象的实体 ...

能用什么方法证实一下么?:loveliness:
回复 使用道具 举报
李爱军 发表于 2012-3-14 19:50
能用什么方法证实一下么?

你可以直接打印p 结果是类名+@+hash值   hash值就是对象在内存中的存放位置  你不论怎么修改hash值都是不会变的
回复 使用道具 举报
我们在创建对象的过程中,我们有要在栈内存创建应用,在堆内存创建对象的实体,这个引用就指向了对象实体,记录住了对象在堆内存中的地址。
当你更改P的属性值的时候,你更改的是堆内存中对象实体的内容,并没有改变引用所指向的内存位置。
所以我们用P再去找这个地址的时候就是你更改完属性之后的内容,比如这个对象过了一年,长了一岁,但是没有改变地址,你所找到的人还是他。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马