A B不同包会报错是因为 A.AInner的构造器是默认构造器,而默认访问级别是允许同包的子类使用的。
所以如果你可以改A类那么你可以写个 portected或者public级别的构造器。
public AInner(){
}
如果你不改A类,你可以看看这个。
我写了一个可以访问的demo。
结构
A类:
package demo;
public class A {
protected static class Test {
public void hello() {
System.out.println("hello");
}
}
}
B类:
package test;
import demo.A;
public class B extends A {
public static void main(String[] args) {
// 这里B可以访问A的内部类,但不能访问内部类的构造器。
// 所以这里实际B只能构造自己的内部类,所以下面用private修饰了这里依旧可以访问。
// 所以这行代码实际是一种多态,父类类型变量指向子类引用。
// 等同 A.Test t = new B.BTest();
B.Test test = new B.BTest();
test.hello();
}
// 因为那个内部类的class是protected的所以B类可以访问A.Test的class
private static class BTest extends A.Test {
}
}