鉴于这些代码很少:
import java.util.Arrays;
public class Sample {
private final int test;
private Sample(int test) {
this.test = test;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(Hello.class.getDeclaredConstructors()));
}
public static class Hello {
private final int i;
private Hello(int i) {
this.i = i;
}
public int getI() {
return i;
}
public static class Builder {
private int i;
private Builder() {
}
public static Builder builder() {
return new Builder();
}
public void add(int i) {
this.i = i;
}
public Hello build() {
return new Hello(i);
}
}
}
}
我不明白显示的输出:
[private Sample$Hello(int), Sample$Hello(int,Sample$1)]
这里列出的第二个构造函数是什么,第二个参数是Builder。我认为输出只显示Hello的私有构造函数,而不是第二个。
答案 0 :(得分:4)
Builder
是Hello
的静态嵌套类,因此它应该能够访问private
构造函数Sample$Hello(int)
。
但是,JVM对嵌套类没有任何特殊支持,因此,从JVM的角度来看,Builder
无法访问Sample$Hello(int)
。
为了解决这个问题,编译器生成具有默认可见性的合成构造函数Sample$Hello(int,Sample$1)
,并从Sample$Hello(int)
调用它而不是Builder
。
Sample$1
是由编译器生成的空类,用于为Sample$Hello(int,Sample$1)
创建区分签名。实际上,这个构造函数的第二个参数始终是null
。