文
章
目
录
章
目
录
Java实例初始化程序是一种代码块,它包含在每次创建新的类实例时都会运行的指令。我们可以使用初始化器块来编写所有构造函数的初始化信息,否则这些信息必须在每个构造函数中单独编写。
1.语法
Java实例初始化块是用花括号创建的。对象初始化语句写在花括号里面。
public class DemoClass {
public DemoClass() {
//statements
}
/* 初始化块 */
{
//statements
}
}
2.Java实例初始化块的工作原理是什么?
在编译期间,Java编译器在每个构造函数的super()语句之后,立即复制初始化块(instance initializer block)的字节码。
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");
}
}
当使用默认构造函数创建实例时,程序输出:
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将会插入默认的父类构造函数。
- 所有的初始化器执行完之后,执行构造函数的语句。
- 我们可以在初始化器中使用这个类和父类的构造函数。
教程 Java基础教程
文章目录前言 第1章 Java语言基础 第2章 流程控制语句 第3章 面向对象编程 第4章 Java 字符串 […]