package java_basic;
public class java_Java创建对象的初始化顺序 {
/**
* @param args
*/
public static void main(String[] args) {
Parent p = new Child();new Child(); 这俩句话效果一样
// parent static init block
// child static init block
// parent init block
// parent constructor
// child init block
// child constructor
/*
* 1, p静态
* 2,静态
* 3,p初始化,构造
* 4,初始化,构造
*/
System.out.println();
System.out.println();
new Child();
// parent init block
// parent constructor
// child init block
// child constructor
/*
* 已经静态一次了
* 1,p初始化,构造
* 2, 初始化,构造
*/
}
}
class Parent {
private static int ps;
private int pv;
static {
System.out.println("parent static init block");
}
{
System.out.println("parent init block");
}
Parent() {
System.out.println("parent constructor");
}
}
class Child extends Parent {
private static int cs;
private int cv;
static {
System.out.println("child static init block");
}
{
System.out.println("child init block");
}
Child() {
System.out.println("child constructor");
}
}
/*
*
Java创建对象的初始化顺序
1. 初始化块
初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句;
初始化块分为instance初始化块和static初始化块,初始化块在构造方法执行之前被执行;
static初始化块不能访问非statci成员,也不能调用非static方法,并且只在类加载时执行一次;
初始化块通常用于提取多个构造方法中的公共代码。
2. 初始化的执行顺序
(1)在初次new一个Child类对象时,发现其有父类,则先加载Parent类,再加载Child类。
(2)加载Parent类:
初始化Parent类的static属性,赋默认值;
执行Parent类的static初始化块;
(3)加载Child类:
初始化Child类的static属性,赋默认值;
执行Child类的static初始化块;
(4)创建Parent类对象:
初始化Parent类的非static属性,赋默认值;
执行Parent类的instance初始化块;
执行Parent类的构造方法;
(5)创建Child类对象:
初始化Child类的非static属性,赋默认值;
执行Child类的instance初始化块;
执行Child类的构造方法;
后面再创建Child类对象时,就按照顺序执行(4)(5)两步。
*/