public class Person { private String name = "default"; // (A) 显式初始化 private int age; // (B) 无显式初始化 public Person(String name) { this.name = name; // (C) 构造器中赋值 } }
字节码(javap -c Person): 复制 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: ldc #2 // String Alice 7: putfield #3 // Field name:Ljava/lang/String; 10: aload_0 11: aload_1 12: putfield #3 // Field name:Ljava/lang/String; 15: return invokespecial #1 调用 super()(父类构造器) ldc + putfield 把 "Alice" 赋给 this.name(字段初始化) aload_1 + putfield 把构造器参数 name 赋给 this.name(你的代码) 字段初始化语句 String name = "Alice"; 确实被编译器插进了构造器, 在 super() 之后、你的代码之前执行。 public Person(String name) { super(); // 隐式调用父类构造器 this.name = "Alice"; // 插入字段初始化 this.name = name; // 你自己的构造器代码 }