Java对象的内存解析

引言:

对象是java的一个核心,如果我们能够搞清楚这些对象在内存中是如何存放的,那我们对于java的理解会更加清晰和深刻

我们通过一段代码来分析java对象的内存分配:

public class PersonTest {
	public static void main(String[] args) {
		
		Person p1 = new Person();
		p1.name = "Tom";
		p1.isMale = true;
		System.out.println(p1.name);
		
		
		Person p2 = new Person();
		System.out.println(p2.name); 
		System.out.println(p2.isMale); 
		

		Person p3 = p1;
		System.out.println(p3.name);
		System.out.println(p3.isMale);
		
		p3.age = 10;
		System.out.println(p1.age);
	}
}

class Person{
	//属性
	String name;
	int age;
	boolean isMale;
}

我们知道,内存里通常有栈,堆以及方法区这几块区域(当然,不止于这几块);

1.堆区:(Heap),此内存区域的目的就是存放对象实例(很多情况下,就是你new出来的的对象),几乎所有的对象实例都在这里分配内存。Java虚拟机中对此描述为:所有的对象实力以及数组都要在堆上分配

2.栈区:(Stack)是指虚拟机栈。虚拟机栈用于存储局部变量等。局部变量存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、 double)、对象引用。 方法执行完,自动释放。
3.方法区 : 用于存储已被虚拟机加载的类、常量、静态变量、等数据。
那我们现在来看上面那段代码中p1,p2,p3这些对象都是如何存放在内存中的。

 

1.首先呢,类Person里面包含了name,age, isMale三个属性;它们分别是:String , int , boolean 类型;在java中,我们知道,它们的默认值分别是: null , 0  , false

2.我们在新造出一个p1对象之后,p1是放在栈区的,然后会得到一个地址,通过该地址去找到该对象被实例化的内容( 即 name,age, isMale 等)。

3.在代码中,刚创建出来的对象都是默认值(0,null , false),后来我们通过"对象.属性"的方式对属性进行了重新赋值,在图中这一过程也体现了出来。

4.然后,我们又创建了一个对象p2,p2依然在栈区,但并没有对p2进行初始化,所以打印出来的都是默认值。 

5.至于p3,我们并没有为它新创建对象,而是直接将p1在堆空间中的地址分配给了p3,所以当p3对属性进行修改的时候,其实改变的就是p1的内容。

从这里我们看出,每一个对象都独立拥有它的一份内存空间

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值