4.对象的实例化过程

一、对象实例化过程 Person p = new Person();

  1. JVM会去读取指定路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接父类的情况下)
  2. 在堆内存中开辟空间,分配地址。
  3. 并在对象空间中,对对象中的属性进行默认初始化
  4. 调用对应的构造函数,进行初始化
  5. 在构造函数中,第一行会先调用父类中的构造函数进行初始化(如果没有显式调用父类的构造函数,默认第一行将调用父类无参构造函数:super())
  6. 父类初始化完毕后,再对子类的属性,进行显示初始化。(在定义类属性时的初始化如:String sex=“boy”?
  7. 指定构造函数中的初始化
  8. 初始化完毕后,将堆内存中的地址值赋给引用变量。
流程图:
4.对象的实例化过程
文章图片

简单来说:
成员变量默认初始化====》父类构造函数初始化===》成员变量定义时显示初始化====》子类构造函数中的初始化
例:
class Father{ int age; String name; public Father(){ } public Father(int age,String name){ System.out.println("Step1"); this.age=age; this.name=name; System.out.println("Step2"); } }class Son extends Father{ String school; public Son(){ //super(); //如子类构造函数中没有显式的调用父类的构造函数, //则编译器默认调用父类无参数的构造函数 } public Son(int age,String name){ super(age,name); System.out.println("Step3"); } public Son(int age,String name,String school){ this(age,name); //this,super语句必须在构造函数的首部 System.out.println("Step4"); this.school=school; } }

【4.对象的实例化过程】注意:
  • super(…)和this(…)调用语句不能同时在一个构造器中出现
  • super(…)或this(…)调用语句只能作为构造器中的第一句出现

    推荐阅读