如果您编写类似的代码,
public class Outer { private class Inner {}}
您会注意到,只有一个构造函数
private Outer$Inner(Outer)
JLS的8.8.9节要求此构造函数,该规则规定,如果未定义构造函数,则必须生成默认构造函数,在这种情况下,默认构造函数必须为private,
在类类型中,如果将该类声明为public,则默认构造函数将隐式赋予访问修饰符public(第6.6节);如果该类被声明为受保护的,则默认构造函数将隐式给予访问修饰符保护(第6.6节);如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有(第6.6节);否则,默认构造函数具有无访问修饰符暗含的默认访问权限。
但是,当您使用如下代码实例化“内部内部”实例时,
public class Outer { private class Inner {} public String foo() { return new Inner().toString(); }}
编译器必须生成一个Outer可以合法调用的构造函数(您不能合法调用私有默认构造函数,因为它是私有的)。因此,编译器必须生成一个新的合成构造函数。根据JLS的13.1节,新的构造函数必须是合成的
除默认构造函数和类初始化方法外,编译器引入的任何在源代码中没有对应结构的构造都必须标记为合成。
此第二个构造函数在源代码中没有对应的构造,因此此新构造函数必须是合成的。由于JLS需要私有默认构造函数,因此仍必须生成第一个私有构造函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)