一个匿名类的构造函数的访问修饰符是什么?

8

注意: 这是一个自问自答的问题。它可能很简单,但我认为值得分享。

假设我有一个匿名类声明:

MyObject myObj1 = new MyObject() {

};

其中MyObject表示:

class MyObject {

    public MyObject() { // explicit public constructor
    }

    ...
}

从Java语言规范的此部分(重点在于“我”):

匿名类不能有显式声明的构造函数。相反,匿名类会为其隐式声明一个匿名构造函数

如果我尝试获取public构造函数的数量:
// Number of public constructors; prints 0
System.out.println(myObj1.getClass().getConstructors().length);

按预期输出了0,即匿名构造函数不是public

它也不是private,因为如果我们从同一包中的不同类中调用以下内容(通过传递实例myObj1):

myObj1.getClass().getDeclaredConstructor().newInstance();

它在没有IllegalAccessException的情况下完成。

匿名类中隐式构造函数的访问修饰符是什么?


你是什么原因进行这项调查的? - dnault
@dnault,我只是在想使用匿名类作为单例模式的概念,并考虑构造函数。 - M A
有什么区别呢?你也叫不了它。 - user207421
@EJP 引发这个问题的问题涉及反射。在现实生活中,是的,我不需要调用它。 - M A
1个回答

9

匿名构造函数类似于编译器为未声明构造函数的普通类创建的默认构造函数。在这种情况下:

对于类类型,如果类被声明为public,则默认构造函数隐式地被赋予访问修饰符public(§6.6);如果类被声明为protected,则默认构造函数隐式地被赋予访问修饰符protected(§6.6);如果类被声明为private,则默认构造函数隐式地被赋予访问修饰符private(§6.6);否则,默认构造函数具有由无访问修饰符隐含的默认访问权限

换句话说,匿名构造函数只能在与匿名类相同的包中访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接