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();
这段代码和第一段差不多一样,只是“方法”里的类不需要重新加载,“堆”里的对象结构一样,数据不一样而已。