这是因为在编译时,编译器会将在声明位置完成的每个初始化都移到类的每个构造函数中。因此,
UCMService类的构造函数可以有效地编译为:
public UCMService(String service){ super(); // First compiler adds a super() to chain to super class constructor dataMap = new DataMap(); // Compiler moves the initialization here (right after `super()`) System.out.println("2222"); this.service = service;}因此,显然
DataMap()构造函数是在类的
UCMService。同样,如果您的类中还有其他构造函数
UCMService,则初始化将移至所有它们。
让我们看一个简单类的字节码:
class Demo { private String str = "rohit"; Demo() { System.out.println("Hello"); }}编译该类,并执行命令-
javap -c Demo。您将看到以下构造函数的字节码:
Demo(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: ldc#2 // String rohit 7: putfield #3 // Field str:Ljava/lang/String; 10: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream; 13: ldc#5 // String Hello 15: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 18: return
您可以
putfield在第7行看到该指令,将field初始化
str为
"rohit",位于
15)



