作者:yeeling610 | 来源:互联网 | 2024-11-22 02:14
本文详细探讨了在Java编程语言中,构造函数、静态代码块和构造代码块的执行顺序。首先明确了静态代码块、构造代码块以及构造函数方法体的执行优先级,随后深入分析了构造函数体执行前的具体步骤,包括父类构造器的调用、非静态变量的初始化等。
1、执行顺序概述
在Java中,当创建一个对象时,程序会按照特定的顺序执行相关的代码块。这些代码块主要包括静态代码块、构造代码块和构造函数方法体。它们的执行顺序依次为:静态代码块 > 构造代码块 > 构造函数方法体。
静态代码块的特点
静态代码块仅能访问静态方法和静态变量,这是因为静态代码块在类加载阶段就会被执行,而此时非静态成员尚未初始化。
2、构造函数执行前的准备步骤
在构造函数的方法体开始执行之前,需要完成以下几个步骤:
- 调用父类的构造器(通过super())。这是确保所有继承层次中的对象都能正确初始化的重要步骤。
- 初始化非静态变量。对于基本数据类型,默认值为0或false;对于引用类型或封装类型,默认值为null。
- 执行构造代码块。构造代码块用于执行一些在构造函数主体执行前必须完成的初始化操作。
特别注意:如果构造函数的第一行是this(),即调用另一个构造函数,则上述步骤2.1至2.3将不会执行,因为this()必须位于构造函数的第一行,以确保其他构造函数能够顺利执行其初始化逻辑。
3、示例代码
package Collection_Set;
public class Test11 {
public Test11() {
System.out.println("父类构造函数被调用");
}
public static void main(String[] args) {}
}
public class Static_Test extends Test11 {
private static int a;
private int b;
static {
a = 1000;
System.out.println("静态代码块执行: a=" + a); // step1
}
{
a = 100;
System.out.println("构造代码块执行: a=" + a); // step4 构造代码块被执行
}
public Static_Test() {
this("有参数被调用a=" + a); // step2
System.out.println("无参被调用"); // step6
}
public Static_Test(String string) {
// step3 父类无参构造函数被调用
// step4 构造代码块被执行
System.out.println(string); // step5
}
public static void main(String[] args) {
Static_Test st = new Static_Test();
System.out.println(st.a);
}
}
4、运行结果
通过上述代码的执行,我们可以观察到各代码块的执行顺序,从而验证理论上的执行流程。