先上程序:
public class Person{
String name;
int age;
public void show(){
System.out.println("姓名"+name+"年龄"+age);
}
}
public class TestPerson{
public static void main(String[] args){
person1=new person(); //创建p1对象
p1.age=24;
p1.name="张三";
p1.show();
person2=new person; //创建p2对象
p2.age=35;
p2.name="李四";
p2.show();
}
}
程序运行前一般会先创建三个空间:栈空间、堆空间、方法区。首先执行main函数,并创建main()方法的栈帧,并创建第一个形参args,默认值为空,null
程序继续运行遇到第一个对象,person1,在栈的main函数里创建p1,并在堆空间开辟属于p1的对应空间,并把地址返回给main函数里的p1.程序继续运行,在堆p1空间里记录变量name(初始默认null)、和age(初始默认0)、show()方法,并在方法区里创建person类。其中:show()属于方法(公用),固定不变,不需要每次都在堆里调用,因此将show()放在方法区,每次用的时候把show()方法区的地址返回给堆空间里的p1或其他地址。其中name属于字符串,也属于固定不变得常量因此name也放在方法区的person类,使用时将name的字符串常量地址返回给堆的p1或其他地址。
程序继续运行来到第二个对象,new person,创建p2的new person栈帧,
程序继续,遇到变量,创建p2的堆空间地址,堆空间里名字可以不一样但是格式要保持一致,并将35赋值给age,将方法区中person类中的第二个名字(字符串)地址返回给堆空间中p2的name中。继续执行调用person类中的show方法。
程序结束。