执行顺序
执行顺序为:静态代码块–>构造代码块–>构造函数–>局部代码块
对象的初始化
1.定义时初始化
public class Teacher {
public String name="dwk";
public int age=21;
}
2.通过构造代码块初始化
public class Teacher {
public String name;
public int age;
{
name="dwk";
age=21;
}
}
3.通过构造方法
public class Teacher {
public String name;
public int age;
public Teacher(){
name="dwk";
age=21;
}
}
定义时初始化和构造代码等级相同,表现为:代码中,谁写在前面,先执行谁。
构造方法,永远在第一类(定义时初始化OR构造代码块)执行结束后才执行。
具体例题
public class Teacher {
// 和方法定义在哪里无关
public String init() {
System.out.println("我是定义时初始化");
return "";
}
// 和构造方法定义在哪里无关,永远最后执行
public Teacher() {
System.out.println("构造方法,永远最后执行");
}
// 第一类:构造代码块
{
System.out.println("我是构造代码块中初始化");
}
// 第一类:定义时初始化
public String name = init();
}
执行结果:
class Print {
public static int a = initStatic();
{
System.out.println("A");
}
public Print() {
this("Hello");
System.out.println("B");
}
public Print(String s) {
System.out.println("C");
}
public int b = init();
public static int initStatic() {
System.out.println("D");
return 0;
}
public int init() {
System.out.println("E");
return 0;
}
static {
System.out.println("F");
}
}
public class Main {
public static void main(String[] args) {
System.out.println("1");
new Print();
System.out.println("2");
new Print();
System.out.println("3");
}
}
打印结果:
当一个类,首次被使用,对该类进行加载,在记载的同时,执行该类的静态初始化过程。
所以,第一次执行会打印DF,后两次不会打印DF