我想确认java编译器如何在任何构造函数中生成初始化块的副本。我认为如下。
情况1)如果构造函数调用另一个重载构造函数,java编译器可能不会生成初始化块的副本。
情况2)如果构造函数不支持另一个重载构造函数,java编译器可能会生成初始化块的副本。
我的理解正确吗?
以下文档是oracle教程的摘录。
https://docs.oracle.com/javase/tutorial/java/javaoo/initial.html
初始化示例成员
通常,您会在构造函数中放入初始化示例变量的代码。使用构造函数初始化示例变量有两种方法:初始值设定项块和final方法。
示例变量的初始值设定项块看起来就像静态初始值设定项块,但没有static关键字:
....
java编译器将初始值设定项块复制到每个构造函数中。
因此,这种方法可用于在多个构造函数之间共享代码块。 <<<<<<<<<<
下面是示例代码。
public class SampleClass {
int id = 0;
static int seqID=1000;
static{
System.out.println("static initialization block: seqID="+ seqID);
}
{
seqID++;
System.out.println("initialization block: seqID=" + seqID);
}
public SampleClass(int id){
System.out.println("constructor start");
this.id = id;
//this.id = seqID;
System.out.println("constructor end");
}
public SampleClass() {
this(seqID);
}
public void func() {
System.out.println("seqID="+seqID+" this.id="+this.id);
}
public static void main(String[]args ) {
SampleClass a=new SampleClass(SampleClass.seqID);
a.func();
SampleClass b=new SampleClass();
b.func();
}
}
==执行结果==
static initialization block: seqID=1000
initialization block: seqID=1001
constructor start
constructor end
seqID=1001 this.id=1000
initialization block: seqID=1002
constructor start
constructor end
seqID=1002 this.id=1001
我研究了这个示例代码的字节码,然后java编译器只在示例(int)构造函数中生成初始化块的副本(java编译器不会在sample()构造函数中生成初始化块的副本。)
暂无答案!
目前还没有任何答案,快来回答吧!