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

初始化块块分为静态初始化块与非静态初始化块,用 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();
    }
}

输出结果如下:

相关推荐
今天背单词了吗9805 分钟前
Spring Boot+RabbitMQ 实战:4 种交换机模式(Work/Fanout/Direct/Topic)保姆级实现
java·spring·中间件·rabbitmq·1024程序员节
九皇叔叔1 小时前
Java循环结构全解析:从基础用法到性能优化
java·开发语言·性能优化
流星5211221 小时前
GC 如何判断对象该回收?从可达性分析到回收时机的关键逻辑
java·jvm·笔记·学习·算法
csdn_aspnet1 小时前
Java 圆台体积和表面积计算程序(Program for Volume and Surface area of Frustum of Cone)
java
sulikey1 小时前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
zzzsde1 小时前
【C++】stack和queue:优先级队列的使用及底层原理
开发语言·c++
杯莫停丶1 小时前
设计模式之:外观模式
java·设计模式·外观模式
乐之者v1 小时前
Mac常用软件
java·1024程序员节
TDengine (老段)1 小时前
TDengine 数据函数 ROUND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·1024程序员节
TDengine (老段)1 小时前
TDengine 数学函数 RAND 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据