静态初始化块与非静态初始化块

初始化块块分为静态初始化块与非静态初始化块,用 static 修饰的就是静态初始化块也称为类初始化块,没有用 static 修饰的代码块就是非静态初始化块也称为实例初始化块。

静态初始化块只会在类初始化的时候调用一次,而非静态初始化块则在每次类实例化的时候都会调用一次。

子类的第一次实例化的时候会先调用父类的静态初始化块,如果父类上面还有父类,则依次类推,最先调用的肯定是最大的父类的静态初始化块。等所有的静态代码块调用完成后,再调用父类的非静态初始化块,而后是子类的非静态初始化块。

初始化块虽然是类的成员之一,类成员有(成员变量、方法、构造器、初始化块),但它没有名字,也就没有标识,但是它并不能被类或者实例来调用,实例初始化块只在创建 JAVA 对象的隐式的执行,而且在构造器之前自动执行,而类初始化块则在类初始化的阶段自动执行。

我们通过简单的例子来说明一下

java 复制代码
public class Animal {
    
    static {
        System.out.println("父类静态初始化块");
    }
    {
        System.out.println("父类实例初始化块");
    }
    
    public Animal(){
        System.out.println("父类构造器");
    }
    
}

public Dog extends Animal {

    static {
        System.out.println("子类静态初始化块");
    }
    
    {
        System.out.println("子类实例初始化块");
    }
    
    public Dog(){
        System.out.println("子类构造器");
    }

}

public class test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Dog dog2 = new Dog();
    }
}

输出结果如下:

相关推荐
Thomas.Sir22 分钟前
第13课:MyBatis-Plus整合SpringBoot4.x,分页、条件查询、逻辑删除实战
java·spring boot
meiying88381 小时前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python
古法安卓1 小时前
Android-GPU压测工具
android·java·android studio
不积跬步无以至千里mmbb261 小时前
rust_analysis
开发语言·后端·rust
SL_staff1 小时前
10人团队如何用轻量私有化文档平台实现知识复用提效?技术视角拆解B/S架构下的协作闭环
java·开源·全栈
释厄6232 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
暴力求解2 小时前
C++ ---继承(二)
开发语言·c++·算法
猫猫.1532 小时前
IO、存储、硬盘、文件系统详细总结
java·java-ee
陈飞EXCEL2 小时前
北京杰飞 IT 旗下妙码生花少儿Python编程上线两大学习系统
开发语言·python·学习
SL_staff2 小时前
设备离线时业务不中断:JVS-IOT高可用架构解析
java·物联网·产品