protected内部类的包外访问问题
1 package package1;
2 public interface A {
3 void show();
4 }
1 package package2;
2 import package1.*;
3 public class B {
4 protected class C implements A{
5 @Override
6 public void show() {
7 System.out.println("B.C");
8 }
9 }
10 }
1 import package1.A;
2 import package2.*;
3 class D extends B{
4 C get() {
5 //return this.new C();//Error: java: C() 在 package2.B.C 中是 protected 访问控制
6 //return new C();//Error: java: C() 在 package2.B.C 中是 protected 访问控制
7 //return new B.C();//Error: java: C() 在 package2.B.C 中是 protected 访问控制
8 }
9 }
在get方法中我们希望返回一个B中内部类C的对象,但编译器会报错。根据protected权限,可知D是B的导出类,应当有权访问C。
产生这样错误的原因在于,在C中并没有显式创建构造器。因此在生成C类对象时,会自动生成默认的构造函数,而默认的构造函数的访问级别与类相同。C中的默认构造函数的访问级别是protected。D只继承了B,而没有继承C,因此C中的protected权限的内容,D无法直接访问。
要想达成以上的目的,可以在C类的声明中,加上下面的语句。
1 public C(){}