1·第一个需要分析内存的代码
public class Person{
int id;
int age;
public static void main(String args[] ) {
Person pl=new Person ();
}
- 初步分析,创建对象前,需要先加载类,这个类加载在方法区
- 只要带new,就在堆中开辟空间
- 总结一下过程,首先先加载=右边的代码,因为是要运行方法,所以要先加载方法,根据方法所含内容在堆中创建一个对象,并赋予它属性 (如果有构造器的话,按构造器来初始化属性),再然后在main方法的栈帧中给p1开辟一个空间,将创建对象的地址赋予他
2·第二个需要分析的代码
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方法创建一个栈帧,并且在栈桢中为p开辟一块空间
- 其次再栈中为构造器在一个栈帧,并在此栈帧中开辟三个空间,分别给形参a b c
- 之后运行等号右边的代码,创建对象。先加载方法,将person.class的字节码信息在方法区创建
- 再根据方法,在队中开辟一块空间(地址是0x67),并且空间中有id age school三个空间
- 再调用有参构造器,将1,20赋给形参a,b。
- 创造一个字符串常量池,将"海淀"(只要是汉字都要放里面)放里面,并且赋予一个地址
- 将“海淀”的地址0x38赋给c
- 之后再将栈中的a b c分别再赋给堆中id age school(注意,school的值依然是一个地址值)
- 再将0x67赋给p
对不同空间的总结