Java的初始化块

简介: 初始化块是一种初始化数据域的方法。

三种初始化数据域的方法:

  • 在构造器中设置值
  • 在声明中赋值
  • 初始化块(initialization block)

初始化块

在一个类的声明中,可以包含多个代码块。只要构造类的对象,这些块就会被执行。

class Employee {
    private static int nextId;
    private int id;
    private String name;
    private double salary;

    // object initialization block
    {
        id = nextId;
        nextId++;
    }
}

在上面这个示例中,无论使用哪个构造器构造对象,id 域都在对象初始化块中被初始化。首先运行初始化块,然后才运行构造器的主体部分。

初始化块这种机制不是必需的,也不常见。通常会直接将初始化代码放在构造器中。


由于初始化数据域有多种途径,所以列出构造过程的所有路径可能相当混乱。下面是调用构造器的具体处理步骤:

  1. 所有数据域被初始化为默认值(0、false 或 null)
  2. 按照在类声明中出现的次序,依次执行所有域初始化语句和初始化块
  3. 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体
  4. 执行这个构造器的主体

静态的初始化块

可以通过提供一个初始化值,或者使用一个静态的初始化块来对静态域进行初始化。

前面已经介绍过第一种机制(提供一个初始化值):private static int nextId = 1;

如果对类的静态域进行初始化的代码比较复杂,那么可以使用静态的初始化块。将代码放在一个块中,并标记关键字 static。下面是一个示例。其功能是将雇员 ID 的起始值赋予一个小于 10000 的随机整数。

// static initialization block
static {
    Random generator = new Random();
    nextId = generator.nextInt(lOOOO);
}

在类第一次加载的时候,将会进行静态域的初始化。与实例域一样,除非将它们显式地设置成其他值,否则默认的初始值是 0、false 或 null。所有的静态初始化语句以及静态初始化块都将依照类定义的顺序执行。

参考资料

《Java核心技术卷一:基础知识》(第10版)第 4 章:对象与类 4.6.7 初始化块

相关文章
|
6月前
|
Java 编译器 Go
25、Java 初始化块和静态初始化块详解,超详细(案例多、官方教程)
25、Java 初始化块和静态初始化块详解,超详细(案例多、官方教程)
222 1
Java 初始化块详解
Java 初始化块详解
169 0
Java 初始化块详解
|
Java 编译器 Go
第25篇:Java 初始化块和静态初始化块详解,超详细(案例多、官方教程)
📜 私有静态方法初始化类变量的好处是:如果你需要重新为类变量进行初始化的时候,私有静态方法可以被重复使用
177 0
第25篇:Java 初始化块和静态初始化块详解,超详细(案例多、官方教程)
|
存储 设计模式 Java
第18篇:Java的类变量、类方法;static 关键字;静态导入;初始化块;静态初始化块;单例模式
☘️ 被static修饰的成员变量可叫做:类变量、静态变量、静态字段 ☘️ 类变量在程序运行过程中只占用一份固定的内存(存储在方法区) ☘️ 可通过类名访问 ☘️ 可通过引用变量名访问(不推荐)
108 0
第18篇:Java的类变量、类方法;static 关键字;静态导入;初始化块;静态初始化块;单例模式
|
Java 程序员
教妹学Java(三十四):代码初始化块
教妹学Java(三十四):代码初始化块
119 0
Java 中的 static 使用之静态变量·静态方法·静态初始化块
Java 中的 static 使用之静态变量 大家都知道,我们可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立。然而在某些时候,我们更希望该类所有的对象共享同一个成员。
|
Java
java中的初始化块
public class Person {   int a=6;//声明实例变量制定默认值,也可以认为是对象的初始化代码,执行顺序与源代码中的排列顺序相同 {   System.
674 0
|
9天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
80 38
|
6天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?