java编译器生成初始化块的字节码

m3eecexj  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(260)

我想确认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()构造函数中生成初始化块的副本。)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题