Java 基础教程

初始化块(Initialization Block)

Java 使用构造器来对单个对象进行初始化操作,使用构造器先完成整个 Java 对象的状态初始化,然后将 Java 对象返回给程序,从而让该 Java 对象的信息更加完整。与构造器作用非常类似的是初始化块,它也可以对 Java 对象进行初始化操作。

初始化块是一种用于初始化类或对象的特殊代码块。它们在类或对象创建时自动执行,用于执行一些初始化操作。Java 中有两种类型的初始化块,分别是实例初始化块和静态初始化块。

注意:

(1)初始化块可以包含任何合法的 Java 代码,可以用于初始化成员变量、调用方法、处理异常等。

(2)初始化块的主要目的是在对象创建之前或类加载之前执行一些必要的操作,以确保对象或类的正确初始化。

静态初始化块(Static Initialization Block)

Java 中使用 static 关键字声明的初始化块。它在类加载时执行,且只执行一次。静态初始化块用于对静态成员变量进行初始化,或执行其他需要在类加载时完成的静态操作。

语法如下:

static {
      // 静态初始化块的代码
}

示例

创建一个 Demo 类,包含一个静态初始化块,输出信息到控制台。代码如下:

public class Demo {
   // msg 设置默认值
   private static String msg = "hello";

   static {
       // 初始化 msg
       msg = "world";
       System.out.println("静态初始化块");
   }

   public static void main(String[] args) {
       System.out.println(msg);
   }
}

运行示例,输出如下:

静态初始化块
world

实例初始化块(Instance Initialization Block)

Java 中没有使用任何关键字声明的初始化块就称为实例初始化块。它在每次创建对象时执行,且在构造函数之前执行。实例初始化块用于对实例成员变量进行初始化,或执行其他需要在对象创建时完成的操作。

语法如下:

{
   // 实例初始化块的代码
}

示例

下面示例通过 new 关键字创建两个 Demo 的实例,观察实例初始化块的执行情况,代码如下:

public class Demo {
   // msg 设置默认值
   private String msg = "A";

   {
       // 初始化 msg
       msg = "B";
       System.out.println("执行实例初始化块");
   }

   public Demo(String msg) {
       this.msg = msg;
       System.out.println("执行构造方法,msg=" + msg);
   }

   public static void main(String[] args) {
       new Demo("demo1");
       new Demo("demo2");
   }
}

运行示例,输出如下:

执行实例初始化块
执行构造方法,msg=demo1
执行实例初始化块
执行构造方法,msg=demo2

初始化块执行顺序

静态初始化块在类加载时执行,只执行一次;实例初始化块在每次创建对象时执行,每个构造函数都会执行。以下是一个示例,展示了静态初始化块和实例初始化块的使用:

public class Demo {

   static {
       System.out.println("执行静态初始化块");
   }

   {
       System.out.println("执行实例初始化块");
   }

   public Demo() {
       System.out.println("执行构造方法");
   }

   public static void main(String[] args) {
       new Demo();
       new Demo();
   }
}

运行实例,输出如下:

执行静态初始化块
执行实例初始化块
执行构造方法
执行实例初始化块
执行构造方法

最后,需要注意的是,初始化块不能被显式地调用,它们会在对象创建或类加载时自动执行。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号