类中静态代码块、实例代码块、构造方法执行次序

本文详细解析了Java中类加载的过程,包括静态代码块、实例代码块及构造方法的执行顺序,并通过具体示例展示了父类与子类加载时的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在类加载的时候,静态代码中的语句会执行,在整个类加载的过程中只执行一次,和创建多少个对象没有关系

    实例代码块中的语句,经过编译后,会添加到构造方法第一条语句之前

    构造方法:每次创建对象时候都会执行

举个简单的例子

public class Person {
    public String name;
    public String gender;
    public int age;
    public Person(String name,String gender,int age){
        this.name =name;
        this.gender = gender;
        this.age = age;
        System.out.println("基类的构造方法");
    }

    {
        System.out.println("基类的实例代码块");
    }

    static {
        System.out.println("基类中的静态代码块");
    }
}
public class Student extends Person{
    public int id;

    public Student(String name,String gender,int age,int id){
        super(name,gender,age);
        this.id = id;
        System.out.println("子类的构造方法");
    }

    {
        System.out.println("子类的实例代码块");
    }

    static {
        System.out.println("子类的静态代码块");
    }

    public static void main(String[] args) {
        Student s1 = new Student("张三","男",24,11111);
        System.out.println("=================================");
        Student s2 = new Student("李四","男",35,11668);
    }
}

执行结果为:

通过分析执行结果,得出以下结论:

1、父类静态代码块优先于子类静态代码块执行,而且是最早执行

2、父类实例方法和父类构造方法紧接着执行

3、子类的实例代码块和子类的构造方法紧接着再执行

4、第二次实例化对象时,父类和子类的静态代码块都将不会再执行

5、静态代码块先执行,并且只执行一次,在类加载阶段执行

6、如果类没有加载,先加载类:先加载基类,后加载子类,基类的静态代码块先执行,子类的代码块后执行,并且都只执行一次

7、当有对象创建的时候,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

  注意:

   1、new哪个类的对象,编译器就会调用该类的构造方法

   2、new子类对象:编译器会调用子类的构造方法

        a、从基类继承下来的成员变量,通过super()调用基类构造方法

        b、子类新增加的成员

   3、基类构造方法中的内容先打印,然后子类构造方法中的内容后打印

   但是:不能通过打印结果说明 先调用基类的构造方法,后调用子类的构造方法(说法错误

### 关于代码块的逻辑分析与参数说明 #### 什么是代码块代码块是指一段可以独立运行的程序片段,通常用于完成特定功能或初始化操作。Java 中主要分为两种型的代码块静态代码块和普通代码块。 #### 静态代码块 (Static Code Block) 静态代码块是在加载时执行的一段代码,主要用于级别的初始化工作。它只会在第一次被加载到内存时执行一次,并且优先于任何对象的创建过程[^1]。 其语法形式如下: ```java static { // 初始化代码 } ``` #### 普通代码块 (Instance Code Block) 普通代码块又称为实例代码块,它是每次创建对象时都会被执行的一段代码,主要用于对象级别的初始化工作。它的执行顺序位于构造函数之前[^3]。 其语法形式如下: ```java { // 实例初始化代码 } ``` --- #### 构造代码块的作用及其优势 通过构造代码块开发者可以在不修改现有构造器的情况下实现通用的初始化逻辑。这种方式不仅减少了重复代码量,还提升了代码的可维护性和可读性。 --- #### 执行顺序总结 当存在继承关系时,代码块执行遵循以下规则: 1. **父静态代码块** 和 **静态属性初始化** 2. **子静态代码块** 和 **静态属性初始化** 3. **父的普通代码块** 和 **普通属性初始化** 4. **父构造方法** 5. **子的普通代码块** 和 **普通属性初始化** 6. **子构造方法** 这种顺序确保了父资源在子资源之前完成初始化,从而避免潜在的风险。 --- #### main 方法中的代码块行为 `main` 方法作为 Java 应用程序的入口点,本身并不属于上述提到的代码块范畴。然而,在 `main` 方法内部也可以定义匿名代码块来局部作用域内完成某些临时性的初始化任务[^4]。例如: ```java public class MainExample { public static void main(String[] args) { int localVar; { localVar = 10; // 局部代码块 System.out.println("Local variable initialized to: " + localVar); } } } ``` --- #### 参数传递的意义 无论是静态还是普通代码块,它们都不接受外部传入的显式参数。这是因为这些代码块的设计初衷是为了简化初始化流程而非处理复杂业务逻辑。如果确实需要动态数据支持,则可以通过成员变量间接获取所需值[^2]。 --- #### 示例代码展示 下面是一个综合演示各种代码块执行次序的例子: ```java class Parent { static { System.out.println("Parent Static Block"); } // 父静态代码块 { System.out.println("Parent Instance Block"); } // 父普通代码块 public Parent() { System.out.println("Parent Constructor"); } } class Child extends Parent { static { System.out.println("Child Static Block"); } // 子静态代码块 { System.out.println("Child Instance Block"); } // 子普通代码块 public Child() { System.out.println("Child Constructor"); } public static void main(String[] args) { new Child(); // 创建子对象触发整个生命周期 } } ``` 输出结果将是按照前述理论严格排列好的每一步骤描述。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薰衣草2333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值