注意:这是一个自我回答的问题。这可能是一个非常简单的,但我认为值得分享。
假设我有一个匿名类声明:
MyObject myObj1 = new MyObject() {
};
其中MyObject
是:
class MyObject {
public MyObject() { // explicit public constructor
}
...
}
来自Java语言规范的this section(强调我的):
匿名类不能具有显式声明的构造函数。而是为匿名类隐式声明匿名构造函数。
如果我尝试获取public
构造函数的数量:
// Number of public constructors; prints 0
System.out.println(myObj1.getClass().getConstructors().length);
它按预期打印零,即匿名构造函数不是public
。
它也不是private
,因为如果我们从定义匿名类的同一个包中的不同类调用以下内容(通过传递实例myObj1
):
myObj1.getClass().getDeclaredConstructor().newInstance();
完成而不是 IllegalAccessException
。
匿名类中隐式构造函数的访问修饰符是什么?
答案 0 :(得分:9)
匿名构造函数的行为类似于编译器也为不声明构造函数的普通类创建的default constructor。在这种情况下:
在类类型中,如果类声明为
public
,则默认构造函数隐式赋予访问修饰符public
(第6.6节);如果该类声明为protected
,则默认构造函数被隐式赋予访问修饰符protected
(§6.6);如果该类声明为private
,则默认构造函数被隐式赋予访问修饰符private
(§6.6); 否则,默认构造函数具有无访问修饰符隐含的默认访问权限。
换句话说,匿名构造函数只能在与匿名类相同的包中访问。