代码一

 public class Person {
        int  id;
        int  age;

        public static void main(String args[]){
                Person p1= new Person();
        }
}

上述代码的内存分析如图所示:

JavaSE-30-1

首先执行 main 方法,第一次创建该类的对象时,先在方法区中加载该类的字节码信息,然后参照字节码信息的模板在堆中创建类的对象,成员遍历 idage 被默认初始化为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, "海淀");
        }
}

上述代码的内存分析如图所示:

JavaSE-30-2

首先执行 main 方法,第一次创建该类的对象时,先在方法区中加载该类的字节码信息,然后参照字节码信息的模板在堆中创建类的对象,成员遍历 idage 被默认初始化为0,school 被默认初始化为 null 。而在栈中生成的 main 方法的栈帧中,p1 存储的是该对象的地址值。随后 new 关键字调用构造器,生成 Person 类构造器的栈帧,这里要注意的是 String 类型的 c“海淀” 这个字符串会被放到字符串常量池,这样下一次用可以直接从常量池中取,而 c 传入的是它的地址值。接着更改各个成员变量的值。最后先销毁 Person 类构造器的栈帧。