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

man*_*uti 8 java constructor anonymous-class

注意:这是一个自我回答的问题.这可能是一个非常简单的,但我认为值得分享.

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

MyObject myObj1 = new MyObject() {

};
Run Code Online (Sandbox Code Playgroud)

在哪里MyObject:

class MyObject {

    public MyObject() { // explicit public constructor
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

从Java语言规范的这一部分(强调我的):

匿名类不能具有显式声明的构造函数.相反,匿名构造函数是为匿名类隐式声明的.

如果我试图获得public构造函数的数量:

// Number of public constructors; prints 0
System.out.println(myObj1.getClass().getConstructors().length);
Run Code Online (Sandbox Code Playgroud)

它按预期打印零,即匿名构造函数不是public.

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

myObj1.getClass().getDeclaredConstructor().newInstance();
Run Code Online (Sandbox Code Playgroud)

它完成没有IllegalAccessException.

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

man*_*uti 9

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

在类类型中,如果声明了类public,则默认构造函数被隐式赋予访问修饰符public(第6.6节); 如果声明了类protected,则默认构造函数被隐式赋予访问修饰符protected(第6.6节); 如果声明了类private,则默认构造函数被隐式赋予访问修饰符private(第6.6节); 否则,默认构造函数具有无访问修饰符隐含的默认访问权限.

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