引入一段代码,大家猜猜结果会是怎么样的呢?
class A {
static int initSA() {
System.out.println("1");
return 0;
}
static {
System.out.println("2");
}
static int sa = initSA();
int a = initA();
int initA() {
System.out.println("3");
return 0;
}
{
System.out.println("4");
}
A() {
System.out.println("5");
}
}
class B extends A {
static int initSA() {
System.out.println("6");
return 0;
}
static {
System.out.println("7");
}
static int sa = initSA();
int a = initA();
int initA() {
System.out.println("8");
return 0;
}
{
System.out.println("9");
}
B() {
System.out.println("10");
}
}
public class InitOrder {
public static void main(String[] args) {
System.out.println("11");
new B();
System.out.println("12");
}
}
结果为:
11 //main方法
2 //父类的静态代码块(这个和下面的取先后顺序)
1 //父类的静态变量
7 //子类的静态代码块(这个和下面的取先后顺序)
6 //子类的静态变量
8 //子类成员变量(本来是父类成员变量,但是该方法被重写,因此显示重写的方法)
4 //父类代码块
5 //父类构造方法
8 //子类成员变量(这个和下面的取先后顺序)
9 //子类代码块
10 //子类构造方法
12 //main方法
总结:
- 父类的静态变量和静态代码块(按照声明顺序)
- 子类的静态变量和静态代码块(按照声明顺序)
- main方法
- 父类的成员变量和代码块(按照声明顺序)
- 父类构造方法
- 子类的成员变量和代码块(按照声明顺序)
- 子类构造方法
- 静态方法,实例方法只有在调用的时候才会去执行。
- 静态代码块在类被加载的时候就执行了,而且只执行一次,并且优先于各种代码块以及构造方法。如果一个类中有多个静态代码块,则会按照书写顺序依次执行。
- 静态代码块的作用:一般情况下,如果有些代码需要在项目启动的时候就执行,这时候就需要静态代码块。比如一个项目启动需要加载的很多配置文件等资源,我们就可以都放入静态代码块中。