创建一个对象时,在一个类中的调用顺序:
- 调用静态代码块和静态属性初始化(注意:静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
- 调用普通代码块和普通属性的初始化(注意:普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)
- 调用构造方法。
小结:
调用顺序: 静态代码块、静态属性(按定义的顺序先后执行) > 普通代码块、普通属性(按定义的顺序先后执行) > 构造器
package test;
public class Main {
public static void main(String[] args) {
// (1) getN1被调用...
// (2) A 静态代码块01
// (3) getN2被调用...
// (4) A 普通代码块01
// (5) A() 构造器被调用
A a = new A();
}
}
class A {
//无参构造器
public A() {
System.out.println("A() 构造器被调用");
}
//普通属性的初始化
private int n2 = getN2();
{ //普通代码块
System.out.println("A 普通代码块01");
}
//静态属性的初始化
private static int n1 = getN1();
static { //静态代码块
System.out.println("A 静态代码块01");
}
public static int getN1() {
System.out.println("getN1被调用...");
return 100;
}
public int getN2() { //普通方法/非静态方法
System.out.println("getN2被调用...");
return 200;
}
}