Java中对象的内存解析

        Java程序定义类的最终目的是使用它,就像使用系统类一样,程序可以创建并使用自定义的类。创建对象的一般格式为: 类名 新建对象名 = new 构造函数();

     如果创建了一个类的多个对象,每个对象就有一套类的属性,不同对象的属性没有任何的关系。当通过某个对象a修改其属性b的值的时候,不会影响到其他对象属性b的值。下面我们来看一下新创建的对象在内存当中是怎样存储起来的。内存结构分为堆和栈,栈中主要存储的是局部变量,所以创建的对象就存储在栈中;而堆中存储的是new出来的结构,比如创建出对象的成员变量。

     下面以一个例子来具体说明,在下面的代码段中,定义了一个Person类,类中有三个属性:姓名、年龄和性别。 在测试类中创建了两个对象p1和p2,而p3不是新创建出来的。

class Person{
	String name;
	int age;
	boolean isMale;
}

class PersonTest{
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.name = "赵印";
		p1.age = 20;
		p1.isMale = true;
		Person p2 = new Person();
		p2.age = 10;
		Person p3 = p1;
		p3.name = "郭艺铭";
	}
}

      Person  p1 = new Person() : 这条语句创建了Person类的一个对象p1,那么p1这个变量是存放在栈中的,new出来的实体存放在堆中,并把实体的首地址传给了变量p1,在还没有更改p1属性值的时候,p1的属性均为默认值。假设实体的首地址值为0x1212,则内存分配如下图所示:

        p1.name = "赵印";
        p1.age = 20;
        p1.isMale = true;

    这三条语句负责更改p1属性的值,结果如下:

     语句 Person p2 = new Person();表示新创建了一个名为p2的对象,创建过程和p1相同,p2.age = 10 负责更改p2中的默认属性值。创建p2的结果如下图所示:

        Person p3 = p1;
        p3.name = "郭艺铭";

     这两条语句表示把p1对象的地址值赋给了p3,并更改了p3的姓名这一属性值。注意p3不是新创建的对象,因为没有出现new运算符。所以p1和p3指向的是堆中的同一片实体空间,对p3中属性值的更改会影响到p1中的值。如下图所示:

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值