实例:
import java.util.*;
import java.util.concurrent.PriorityBlockingQueue;
class X {
public static int x = getX();
static {
System.out.println("父类的静态代码块");
}
{
System.out.println("父类的非静态代码块");
}
public X() {
System.out.println("父类的构造方法");
}
public static int getX() {
System.out.println("父类的静态变量");
return 1;
}
}
class Y extends X {
public static int y = getY();
static {
System.out.println("子类的静态代码块");
}
{
System.out.println("子类的非静态代码块");
}
public Y() {
System.out.println("子类的构造方法");
}
public static int getY() {
System.out.println("子类的静态变量");
return 2;
}
}
public class NormalTest {
public static void main(String[] args) {
new Y();
}
}
// 运行结果如下:
// 父类的静态变量
// 父类的静态代码块
// 子类的静态变量
// 子类的静态代码块
// 父类的非静态代码块
// 父类的构造方法
// 子类的非静态代码块
// 子类的构造方法
java程序的初始化可以看做是代码块的执行,他们的执行顺序如下:
(1)父类的静态变量
(2)父类的静态代码块
(3)子类的静态变量
(4)子类的静态代码块
(5)父类非静态变量
(6)父类非静态代码块
(7)父类构造函数
(5)子类非静态变量
(6)子类非静态代码块
(7)子类构造函数
这其中有这以下几点规则:
(1)因为在代码块中可能会对变量进行赋值操作,所以变量初始化操作优先于代码块初始化
(2)因为在构造函数中可能会对变量进行赋值操作,所以变量初始化优先于构造函数的初始化
(3)静态的初始化优先于非静态的初始化