protected内部类的包外访问问题

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(){}

 

 

posted @ 2021-05-31 10:43  sumAll  阅读(137)  评论(0编辑  收藏  举报