jvm内存模型_程序执行分析

public class Person {
	String name;
	int age;
	public  void show(){
		System.out.println("姓名:"+name+",年龄:"+age);
	}
}

public class TestPerson {
	public static void main(String[ ] args) {
		// 创建p1对象
		Person p1 = new Person();
		p1.age = 24;
		p1.name = "张三";
		p1.show();
		// 创建p2对象
		Person p2 = new Person();
		p2.age = 35;
		p2.name = "李四";
		p2.show();
	}
}

这是一段简单的代码,下面我们先画出它运行图在这里插入图片描述
#行第一步会在栈里创建一个main方法的栈帧,在执行main方法时会首先会在“方法”里加载类的信息,栈帧里会存储我们的局部变量,参数,方法信息,返回值等,
第一个是形参args它的值是null继续执行preson,P1,下一个是new preson();创建一个对象,然后在“栈”里会为他开辟一个新的栈帧preson,这时在“堆”里就会形成一个对象,这个对象包含了preson这个类里的的属性,有nanme,它的值暂时为null,age,它的值暂时为0、show,因为show是个方法也没必要给每个对象都输入,所以这个show在“方法里”,我们可以给“堆”里这个对象命名0x11,Person p1 = new Person();这句代码的意思就等于把0x11这个地址赋给P1,Person p1 = new Person();这是这行代码就执行完了,就可以吧preson这个栈帧删除。下一行 p1.age = 24;,P1等于0x11所以就给age赋值24,p1.name = “张三”;,这个“张三是字符串需要我们自定义,它是一个类也是个对象,所以在程序启动的时候就已经加载在“方法”里了,只需要把地址给name就可以。p1.show();,运行到这段代码P1.show()是一个方法所以需要在“栈”里给它开辟一个栈帧,它看着没有参数,但实际上有一个隐形参数this:0x11,相当于自己调自己,执行完后直接删除。
运行第二段代码:
Person p2 = new Person();
p2.age = 35;
p2.name = “李四”;
p2.show();
这段代码和第一段差不多一样,只是“方法”里的类不需要重新加载,“堆”里的对象结构一样,数据不一样而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值