在 Java 里,不同类型代码有着特定的执行顺序,理解这些顺序对掌握程序运行逻辑十分关键。下面将详细阐述 Java 中不同类型代码(静态代码块、实例代码块、构造方法、静态变量、实例变量、静态方法、实例方法等)的执行顺序。
单类中的代码执行顺序
当只有一个类时,代码执行顺序通常为:静态变量初始化、静态代码块、实例变量初始化、实例代码块、构造方法。
class SingleClassExample {
// 静态变量
static int staticVariable = initStaticVariable();
// 实例变量
int instanceVariable = initInstanceVariable();
// 静态代码块
static {
System.out.println("静态代码块执行");
}
// 实例代码块
{
System.out.println("实例代码块执行");
}
// 构造方法
public SingleClassExample() {
System.out.println("构造方法执行");
}
// 初始化静态变量的方法
static int initStaticVariable() {
System.out.println("静态变量初始化");
return 1;
}
// 初始化实例变量的方法
int initInstanceVariable() {
System.out.println("实例变量初始化");
return 1;
}
public static void main(String[] args) {
new SingleClassExample();
}
}
执行结果
继承关系下的代码执行顺序
当存在继承关系时,代码执行顺序会有所不同,整体顺序为:父类静态变量初始化、父类静态代码块、子类静态变量初始化、子类静态代码块、父类实例变量初始化、父类实例代码块、父类构造方法、子类实例变量初始化、子类实例代码块、子类构造方法。
class ParentClass {
// 父类静态变量
static int parentStaticVariable = initParentStaticVariable();
// 父类实例变量
int parentInstanceVariable = initParentInstanceVariable();
// 父类静态代码块
static {
System.out.println("父类静态代码块执行");
}
// 父类实例代码块
{
System.out.println("父类实例代码块执行");
}
// 父类构造方法
public ParentClass() {
System.out.println("父类构造方法执行");
}
// 初始化父类静态变量的方法
static int initParentStaticVariable() {
System.out.println("父类静态变量初始化");
return 1;
}
// 初始化父类实例变量的方法
int initParentInstanceVariable() {
System.out.println("父类实例变量初始化");
return 1;
}
}
class ChildClass extends ParentClass {
// 子类静态变量
static int childStaticVariable = initChildStaticVariable();
// 子类实例变量
int childInstanceVariable = initChildInstanceVariable();
// 子类静态代码块
static {
System.out.println("子类静态代码块执行");
}
// 子类实例代码块
{
System.out.println("子类实例代码块执行");
}
// 子类构造方法
public ChildClass() {
System.out.println("子类构造方法执行");
}
// 初始化子类静态变量的方法
static int initChildStaticVariable() {
System.out.println("子类静态变量初始化");
return 1;
}
// 初始化子类实例变量的方法
int initChildInstanceVariable() {
System.out.println("子类实例变量初始化");
return 1;
}
public static void main(String[] args) {
new ChildClass();
}
}
运行结果
总结
Java 中代码的执行顺序如下:
类加载阶段:静态变量和静态代码块。
对象创建阶段:实例变量、实例代码块、构造方法。
继承关系:先父类后子类。
方法调用:按调用栈顺序执行。
理解代码的执行顺序有助于编写正确、高效的 Java 程序。