Java 非静态初始值设定项块-我有更多的控制吗?
我仍然在学习Java。为了进一步了解初始化程序块,我创建了一个小测试类:Java 非静态初始值设定项块-我有更多的控制吗?,java,Java,我仍然在学习Java。为了进一步了解初始化程序块,我创建了一个小测试类: public class Script { { Gadgets.log("anonymous 1"); } public Script() { Gadgets.log("constructor"); } { Gadgets.log("anonymous 2"); } } 创建实例时,我会得到以下日志: Script: a
public class Script {
{
Gadgets.log("anonymous 1");
}
public Script() {
Gadgets.log("constructor");
}
{
Gadgets.log("anonymous 2");
}
}
创建实例时,我会得到以下日志:
Script: anonymous 1
Script: anonymous 2
Script: constructor
这告诉我,两个初始值设定项块都在构造函数之前运行,按照它们在源代码中出现的顺序(与静态初始值设定项相同)。
我想知道的是:我对这种行为有更多的控制吗?
因为Java文档说():
实例变量的初始值设定项块看起来就像静态的
初始值设定项阻止,但不包含static关键字:
Java编译器将初始值设定项块复制到每个构造函数中。所以,,
这种方法可用于在多个服务器之间共享一块代码
构造器
那么,“将初始值设定项块复制到每个构造函数中”到底意味着什么呢?根据我的日志,它们似乎是在每个构造函数的开头复制的。是这样吗
如果将这些块复制到每个构造函数的末尾(这是我在anonymous 2中所期望的),那么在多个构造函数之间共享这些块也是非常有意义的。
如果我想在每个构造函数的末尾执行常见任务,是否有一种方法可以更有效地控制这些块,或者是我唯一的选择,即编写命名方法的“经典”方法,在每个构造函数中调用该方法?构造函数按以下顺序执行:
super()
调用,隐式或显式如果存在一个
this()
调用,它将替换(1)和(2)。在构造函数之前而不是之后复制代码有什么问题?我希望它们必须在构造函数中的代码之前执行,而不是在最后执行,因为构造函数完全可以依赖已经初始化的变量。实际上,初始化块被复制到构造函数中,并在super
之后执行,但在其他构造函数体之前执行。您仍然需要构造函数,因为在初始化过程中可能需要传递一些值。我认为这两种方法都非常合理—开始和结束。在开始时初始化构造函数的内容,在结束时使用作为参数传递给构造函数的内容。非常感谢。在卖掉我的日志后,我希望我不能对这件事有更多的控制。现在我知道了。
{
// whatever code is needed for initialization goes here
}