出错代码
package org.example;
public class A {
protected static class Inner{
static public int n = 2;
}
}
package org.example.nono;
import org.example.A;
public class B extends A {
public void test(){
System.out.println(Inner.n); //这句正常
Inner e = new Inner(); //这句报错
}
}
结果
在子类B中调用父类A的内部类Inner去创建一个对象时,报错了,如下:
Inner() 在 org.example.A.Inner 中是 protected 访问控制
原因
一句话总结就是:能够访问类Inner 不等于 能够访问类Inner的构造函数。
首先,通过Inner.n执行正常可以看出B的确能够访问类Inner,这点符合我们对protected的理解。
但是创建Inner对象时B需要访问类Inner的构造函数,而B访问不了Inner的构造函数所以就出错了。
我们没有定义Inner的构造函数,所以编译器默认为我们加了构造函数,访问权限就跟Inner类一样(protected)。所以如果要访问Inner(),就得是跟Inner类在同一个包下,或者是Inner类的子类。显然B并没有满足上面两条。此时Inner类对B来说就像一个普通的类,可以访问这个类,但是对类内加了protected的成员不能访问。
解决办法
- 自己定义public构造函数
public Inner(){}
- 让A和B在同一个包下,这样B就和Inner在同一个包下了。