一、对象实例化过程
Person p = new Person();- JVM会去读取指定路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接父类的情况下)
- 在堆内存中开辟空间,分配地址。
- 并在对象空间中,对对象中的属性进行默认初始化
- 调用对应的构造函数,进行初始化
- 在构造函数中,第一行会先调用父类中的构造函数进行初始化(如果没有显式调用父类的构造函数,默认第一行将调用父类无参构造函数:super())
- 父类初始化完毕后,再对子类的属性,进行显示初始化。(在定义类属性时的初始化如:String sex=“boy”?
- 指定构造函数中的初始化
- 初始化完毕后,将堆内存中的地址值赋给引用变量。
流程图:
简单来说:
成员变量默认初始化====》父类构造函数初始化===》成员变量定义时显示初始化====》子类构造函数中的初始化
例:
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;
}
}
注意:
- super(…)和this(…)调用语句不能同时在一个构造器中出现
- super(…)或this(…)调用语句只能作为构造器中的第一句出现