代码一
public class Person {
int id;
int age;
public static void main(String args[]){
Person p1= new Person();
}
}
上述代码的内存分析如图所示:
首先执行 main
方法,第一次创建该类的对象时,先在方法区中加载该类的字节码信息,然后参照字节码信息的模板在堆中创建类的对象,成员遍历 id
和 age
被默认初始化为0。而在栈中生成的 main
方法的栈帧中,p1
存储的是该对象的地址值。
代码二
public class Person {
int id;
int age;
String school;
public Person (int a,int b,String c){
id=a;
age=b;
school=c;
}
public static void main(String args[]){
Person p= new Person(1,20, "海淀");
}
}
上述代码的内存分析如图所示:
首先执行 main
方法,第一次创建该类的对象时,先在方法区中加载该类的字节码信息,然后参照字节码信息的模板在堆中创建类的对象,成员遍历 id
和 age
被默认初始化为0,school
被默认初始化为 null
。而在栈中生成的 main
方法的栈帧中,p1
存储的是该对象的地址值。随后 new
关键字调用构造器,生成 Person
类构造器的栈帧,这里要注意的是 String
类型的 c
,“海淀”
这个字符串会被放到字符串常量池,这样下一次用可以直接从常量池中取,而 c
传入的是它的地址值。接着更改各个成员变量的值。最后先销毁 Person
类构造器的栈帧。