Java 初始化块的行为

Java 初始化块的行为,java,constructor,initialization,Java,Constructor,Initialization,我有我无法理解的代码,它是如何产生输出的。下面是代码- 代码: 输出: r1 r4 b1之前的b2 r3 r2 hawk 问题: 关于此代码,我的具体问题如下- 当Hawk类停止时,它会导致Raptor类停止,因此静态代码块首先运行。但是,在打印pre之前,静态代码后面应该跟着非静态代码。不是吗 这些非静态初始化块实际上看起来像构造函数。那么,这些可以在常规编程中用作构造函数吗 在打印预编码之前,静态代码后面应紧跟非静态代码。不是吗 运行Hawk.main会触发所有三个类的初始化。这是静态启动器

我有我无法理解的代码,它是如何产生输出的。下面是代码-

代码: 输出:
r1 r4 b1之前的b2 r3 r2 hawk

问题: 关于此代码,我的具体问题如下-

  • Hawk
    类停止时,它会导致
    Raptor
    类停止,因此静态代码块首先运行。但是,在打印
    pre
    之前,静态代码后面应该跟着非静态代码。不是吗
  • 这些非静态初始化块实际上看起来像构造函数。那么,这些可以在常规编程中用作构造函数吗
  • 在打印预编码之前,静态代码后面应紧跟非静态代码。不是吗

  • 运行
    Hawk.main
    会触发所有三个类的初始化。这是静态启动器运行时
  • pre
    已打印
  • newhawk()
    触发所有三个类的实例初始值设定项的执行
  • 这些可以在常规编程中用作构造函数吗


    它们最终与构造函数中的代码一起编译成
    方法。是的,它们类似于构造函数代码。关键的区别在于,它们运行时不考虑哪个构造函数运行,并且在构造函数主体之前运行。

    类加载时会运行
    static
    块,因此它们甚至会在方法
    main()
    运行之前运行

    初始化程序块在构造函数之前运行。构造函数和初始值设定项块之间的区别在于构造函数可以有参数


    还要注意,初始值设定项块和构造函数首先在基类中运行,然后在子类中运行。

    1-pre首先打印,因为只有在运行new Hawk()时才实际创建Hawk(),在此之前,只执行静态初始值设定项

    2-非静态初始化通常用于初始化变量中的值,但由于无法将参数传递给它们,因此与构造函数相比,不太可能实现相同的初始化。在这些块中,可以将属性初始化为常量值或空值

  • 首先运行静态初始值设定项(实际上按照定义的顺序)
  • 您可以使用初始值设定项块,但在声明或构造函数中初始化字段是一种常见的习惯用法

  • hawk应该是hawk的首选权限。因此,它们在每次创建新实例时都会运行?@PrateekSingla yes初始化器在每次创建对象时都会运行。实例初始化器初始化每个实例。类(静态)初始值设定项初始化类。有时,在初始值设定项块中运行某些初始化操作会更容易,因为您可以在那里访问文件(例如,加载RSA密钥)。编写该类可能更容易,但测试:-)是否更容易?
    class Bird {
      { System.out.print("b1 "); }
      public Bird() { System.out.print("b2 "); }
    }
    class Raptor extends Bird {
      static { System.out.print("r1 "); }
      public Raptor() { System.out.print("r2 "); }
      { System.out.print("r3 "); }
      static { System.out.print("r4 "); }
    }
    class Hawk extends Raptor {
      public static void main(String[] args) {
        System.out.print("pre ");
        new Hawk();
        System.out.println("hawk ");
      }
    }