Java 实例初始化块

IT 文章2年前 (2023)发布 小编
0 0 0

Java实例初始化程序是一种代码块,它包含在每次创建新的类实例时都会运行的指令。我们可以使用初始化器块来编写所有构造函数的初始化信息,否则这些信息必须在每个构造函数中单独编写。

1.语法

Java实例初始化块是用花括号创建的。对象初始化语句写在花括号里面。

public class DemoClass {
  public DemoClass() {
    //statements
  }
  /* 初始化块 */
  {
    //statements
  }
}

2.Java实例初始化块的工作原理是什么?

在编译期间,Java编译器在每个构造函数的super()语句之后,立即复制初始化块(instance initializer block)的字节码。

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

public class Main {
  public Main() {
    System.out.println("Statement in constructor");
  }
  {
    System.out.println("Statement in initializer");
  }
}

考虑上述程序,其中构造函数和初始化块都有一个打印语句。在代码被编译后,字节码在逻辑上结构如下:

public class Main {
  public Main() {
    super();
    System.out.println("Statement in initializer");
    System.out.println("Statement in constructor");
  }
}

我们可以通过执行程序来验证这种结构,该程序打印以下输出:

Statement in initializer
Statement in constructor

3.Java实例初始化块执行顺序

如果一个类中有多个初始化块,它们将按照类定义中出现的顺序执行。在以下示例中,初始化程序块 1 始终在块 2 之前执行。

public class Main {
  public Main() {
    System.out.println("Statement in constructor 2");
  }
  {
    System.out.println("Statement in initializer 1");
  }
  {
    System.out.println("Statement in initializer 2");
  }
}

当使用默认构造函数创建实例时,程序输出:

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集

Statement in initializer 1
Statement in initializer 2
Statement in constructor 2

4. 继承

当父类和子类都有初始化块时,创建子类实例时的流程顺序如下:

  • 调用子类构造函数。
  • 子类构造函数的第一个语句是super()(或提供显式构造函数),因此调用父类构造函数。
  • Parent的初始化程序按照其出现的顺序执行。
  • Parent的构造函数语句被执行。
  • 子类的初始化程序按照其出现的顺序执行。
  • 执行子类构造函数语句。

让我们看看上面的操作:

class ParentClass {
  public ParentClass() {
    System.out.println("In ParentClass Constructor");
  }
  {
    System.out.println("In ParentClass Instance Initializer");
  }
}
class ChildClass extends ParentClass {
  public ChildClass() {
    super();  //如果不写, JVM会默认自动插入
    System.out.println("In ChildClass Constructor");
  }
  {
    System.out.println("In ChildClass Instance Initializer 1");
  }
  {
    System.out.println("In ChildClass Instance Initializer 2");
  }
}

当我们创建ChildClass的实例时,程序输出:

In ParentClass Instance Initializer
In ParentClass Constructor
In ChildClass Instance Initializer 1
In ChildClass Instance Initializer 2
In ChildClass Constructor

5.Java实例初始化块的特点

  • 我们可以在一个类中定义多个实例初始化块。
  • 所有的实例初始化块按照它们在类主体中出现的顺序依次执行。
  • 实例初始化块在调用父类构造函数之后、执行子类构造函数之前运行。
  • 请注意,如果我们没有在子类的构造函数中明确地提供默认的父类构造函数super(),Java将会插入默认的父类构造函数。
  • 所有的初始化器执行完之后,执行构造函数的语句。
  • 我们可以在初始化器中使用这个类和父类的构造函数。

[course ids=7934]

© 版权声明

相关文章

暂无评论

暂无评论...