一、类的加载顺序
代码如下(示例):
class Root {
static {
System.out.println("root的静态初始化块");
}
{
System.out.println("root的普通初始化块");
}
public Root () {
System.out.println("root的无参构造器");
}
public Root (String msg) {
this();
System.out.println("Root的带参构造器" + msg);
}
}
class Mid extends Root {
static {
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid() {
super("这有个参数");
System.out.println("Mid的无参构造器");
}
public Mid(String msg) {
this();
System.out.println("Mid的带参构造器" + msg);
}
}
class Leaf extends Mid{
static {
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf() {
super("这还有个参数");
System.out.println("Leaf的无参构造器");
}
}
public class LeafTest {
public static void main(String[] args) {
Leaf leaf1 =new Leaf();
System.out.println("*****************");
Leaf leaf2 =new Leaf();
}
}
2运行结果
代码如下(示例):
root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
root的普通初始化块
root的无参构造器
Root的带参构造器这有个参数
Mid的普通初始化块
Mid的无参构造器
Mid的带参构造器这还有个参数
Leaf的普通初始化块
Leaf的无参构造器
*****************
root的普通初始化块
root的无参构造器
Root的带参构造器这有个参数
Mid的普通初始化块
Mid的无参构造器
Mid的带参构造器这还有个参数
Leaf的普通初始化块
Leaf的无参构造器
总结
规律:由父及子,静态先行,代码块先于构造器
1、首先,在new一个对象之前会先加载类,在加载类时会先加载父类(没有自定义父类就是object类),然后依次加载子类,因为静态块是随着类的加载而执行,所以最先输出的是三个类的静态块
2.其次构造器中的super,会再一次到父类,所以会继续依次执行三个类中的非静态代码块,最后是构造函数
3. 因为静态块只在类加载时执行一次,所以当再一次new一个对象时 ,会从父类的非静态代码块开始,然后是构造器