Java 实例初始化块

培训教学 潘老师 8个月前 (08-31) 179 ℃ (0) 扫码查看

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 字符 […]


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/8511.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】