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 ");
}
}