对象的初始化顺序
加载类:先加载父类再加载子类
创建对象要先加载类。java中类的加载顺序是先加载父类再加载子类。而静态成员变量、静态成员函数、静态代码块等静态资源都是类的加载时就完成的。
所以先执行父类静态代码块再执行子类代码块
初始化:先初始化父类再初始化子类
先执行父类构造代码块、父类构造函数
再执行子类构造代码块、子类构造函数
举例说明:Children child= new Children();创建了一个子类对象默认执行了哪些方法?
public class Parent {
public Parent() {
super();
System.out.println("执行父类构造方法");
}
static{
System.out.println("执行父类静态代码块");
}
{
System.out.println("执行父类的非静态代码块");
}
}
public class Children extends Parent{
public Children() {
super();
System.out.println("执行子类构造方法");
}
static{
System.out.println("执行子类静态代码块");
}
{
System.out.println("执行子类的非静态代码块");
}
}
测试一:测试代码如下
public static void main(String[] args) {
Children child= new Children();
}
执行结果如下:
执行父类静态代码块
执行子类静态代码块
执行父类的非静态代码块
执行父类构造方法
执行子类的非静态代码块
执行子类构造方法
测试二:在测试一代码的基础上再多new一个对象
public static void main(String[] args) {
Children child= new Children();
System.out.println("-------------分割线------------");
Children child2 = new Children();
}
测试二执行结果如下:
执行父类静态代码块
执行子类静态代码块
执行父类的非静态代码块
执行父类构造方法
执行子类的非静态代码块
执行子类构造方法
-------------分割线------------
执行父类的非静态代码块
执行父类构造方法
执行子类的非静态代码块
执行子类构造方法
测试二中new第二个实例child2时,对象的初始化明显比第一个实例child初始化少了静态代码块的执行。这是因为child2实例时,类已经加载完成,类只加载一次所以静态代码块只执行一次,因此后面再new时都不会再执行了。