橘子味的心
标题:Java实例初始化程序块

实例初始化程序块用于初始化实例数据成员。 它在每次创建类的对象时运行。实例变量的初始化可以是直接的,但是可以在初始化实例初始化块中的实例变量时执行额外的操作。

什么是实例初始化块的使用,我们可以直接分配一个值在实例数据成员? 例如:

  1. class Bike{
  2. int speed=100;
  3. }
  4. Java

为什么要使用实例初始化块?

假设在赋值给实例数据成员时必须要执行一些操作。 如:使用for循环来填充复杂数组或错误处理等。

实例初始化程序块的示例

下面来看看实例初始化块执行初始化的简单例子。

  1. class Bike7 {
  2. int speed;
  3.  
  4. Bike7() {
  5. System.out.println("speed is " + speed);
  6. }
  7.  
  8. {
  9. speed = 100;
  10. }
  11.  
  12. public static void main(String args[]) {
  13. Bike7 b1 = new Bike7();
  14. Bike7 b2 = new Bike7();
  15. }
  16. }
  17. Java

执行上面代码得到以下结果 -

  1. speed is 100
  2. speed is 100
  3. Shell

在Java中有三个地方可以执行实例初始化块操作:

  1. 方法
  2. 构造函数
  3. 代码块

实例初始化块或构造函数哪个先调用?

看看下面代码就知道了。

  1. class Bike8 {
  2. int speed;
  3.  
  4. Bike8() {
  5. System.out.println("constructor is invoked");
  6. }
  7.  
  8. {
  9. System.out.println("instance initializer block invoked");
  10. }
  11.  
  12. public static void main(String args[]) {
  13. Bike8 b1 = new Bike8();
  14. Bike8 b2 = new Bike8();
  15. }
  16. }
  17. Java

执行上面代码得到以下结果 -

  1. instance initializer block invoked
  2. constructor is invoked
  3. instance initializer block invoked
  4. constructor is invoked
  5. Shell

在上面的例子中,似乎首先调用实例初始化块,但是可惜不是。 实例初始化块在对象创建时被调用。 java编译器在第一个语句super()之后的构造函数中复制实例初始化块。 首先,调用构造函数。 让我们通过下面的图来理解它:

注意:java编译器在每个构造函数中会自动复制实例初始化块的代码。

实例初始化块的规则:

实例初始化块主要有三个规则。 它们如下:

  1. 在创建类的实例时创建实例初始化程序块。
  2. 在父类构造函数被调用之后(即在super()构造函数调用之后)调用实例初始化块。
  3. 实例初始化程序块按它们显示的顺序排列。

super()之后调用的实例初始化块的程序示例:

  1. class A {
  2. A() {
  3. System.out.println("parent class constructor invoked");
  4. }
  5. }
  6.  
  7. class B2 extends A {
  8. B2() {
  9. super();
  10. System.out.println("child class constructor invoked");
  11. }
  12.  
  13. {
  14. System.out.println("instance initializer block is invoked");
  15. }
  16.  
  17. public static void main(String args[]) {
  18. B2 b = new B2();
  19. }
  20. }
  21. Java

上面代码执行结果如下 -

  1. parent class constructor invoked
  2. instance initializer block is invoked
  3. child class constructor invoked
  4. Java

实例块的另一个示例

  1. class A {
  2. A() {
  3. System.out.println("parent class constructor invoked");
  4. }
  5. }
  6.  
  7. class B3 extends A {
  8. B3() {
  9. super();
  10. System.out.println("child class constructor invoked");
  11. }
  12.  
  13. B3(int a) {
  14. super();
  15. System.out.println("child class constructor invoked " + a);
  16. }
  17.  
  18. {
  19. System.out.println("instance initializer block is invoked");
  20. }
  21.  
  22. public static void main(String args[]) {
  23. B3 b1 = new B3();
  24. B3 b2 = new B3(10);
  25. }
  26. }
  27. Java

上面代码执行结果如下 -

  1. parent class constructor invoked
  2. instance initializer block is invoked
  3. child class constructor invoked
  4. parent class constructor invoked
  5. instance initializer block is invoked
  6. child class constructor invoked 10
  7. Java