当我运行以下代码时,我得到的输出为:
static block
TEst block
main block
如何打印字符串“TEst block”?它被视为构造函数吗?
public class TestBlk {
static {
System.out.println("static block");
}
{
System.out.println("TEst block");
}
public static void main(String args[]){
TestBlk blk=new TestBlk();
System.out.println("main block");
}
}
答案 0 :(得分:12)
它是一个实例初始化,以及一个默认构造函数。
没有显式构造函数的类被赋予合成的,public,no-args构造函数。
没有调用this()
或super()
(可能带参数)的构造函数被赋予对super()
的隐式调用(没有参数,可能内部类发生奇怪的事情)。
在对super()
进行隐式或显式调用后,字段初始化程序和实例初始化程序中的所有代码都会按照它在源代码中显示的顺序插入。
所以在javac完成你的代码后,它看起来有点像:
public class TestBlk {
static {
System.out.println("static block");
}
public TestBlk() {
// Call constructor of java.lang.Object.
super();
// From instance (and field)initialiser.
System.out.println("TEst block");
// Rest of constructor:
}
public static void main(String args[]){
TestBlk blk = new TestBlk();
System.out.println("main block");
}
}
答案 1 :(得分:2)
这里有你所谓的:初始化块。
初始化块是一个块 执行的大括号之间的代码 在类的对象之前 创建
有两种类型的初始化块:
非静态初始化块。
{
System.out.println("TEst block");
}
静态初始化块。
static
{
System.out.println("static block");
}
更具体地说,我喜欢here的解释:
注意任何初始化块 出现在课堂 中 在构造函数之前 。
所以现在问题出现了我们需要的原因 如果我们有初始化块,则构造函数。答案是我们不需要默认值 构造函数,但初始化块 无法参数化等等 不能有从中获取值的对象 out side等初始化块 不能替代构造函数。
答案 2 :(得分:0)
当你拨打new TestBlk()
时,它被称为对象构造的一部分。
答案 3 :(得分:0)
{
System.out.println("TEst block");
}
这是一个初始化块。查看我的answer to this other question。