类加载顺序
(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。
(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(4)执行父类构造方法。
(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。
(6)执行子类构造方法。
下面提供了有关静态初始化块和静态变量的顺序的几个例子。
例子1: 静态初始化块在静态变量之前时
public class StaticTest {
static{
a = 1;
}
static int a = 2;
public static void main(String [] args){
System.out.println(a);//2
}
}
例子2: 静态初始化块在静态变量之后时
public class StaticTest {
static int a = 2;
static{
a = 1;
}
public static void main(String [] args){
System.out.println(a);//1
}
}
例子3: 静态初始化块中声明的局部变量没用
public class StaticTest {
static int a = 2;
static{
int a = 1; //The value of the local variable a is not used
}
public static void main(String [] args){
System.out.println(a); //2
}
}
例子4:
public class StaticTest {
static int a = 2;
static{
a = 1;
}
public static void main(String [] args){
System.out.println(a); //4
}
static{
a += 3;
}
}
例子5:静态方法和静态初始化块(静态方法不调用就不执行)
public class StaticTest {
static{
System.out.println("aa");
}
static void aa(){
System.out.println("bb");
}
public static void main(String [] args){
System.out.println("cc");
}
static{
System.out.println("dd");
}
}
输出: aa
dd
cc