The problem comes from 《thinking in java》chapter8,exercise12,which requires packages and a protected inner class.I turn B4.java into:package package2; import package1.*;public class B4 { protected class C4 implements A4 { public C4() {} public void a4() { System.out.println("a4()"); } } } and E12_InnerClass.java into:package package2; import package1.*;public class E02_Interface implements A { public void A1() { System.out.println("A1()"); } public void A2() { System.out.println("A2()"); } public void A3() { System.out.println("A3()"); } public static void main(String[] args) { E02_Interface i=new E02_Interface(); i.A1(); i.A2(); i.A3(); } } and then the compiler doesn't complain.
inner class C4 的权限是protected,说明它在被继承时是可见的,
这没有什么可说的,如果C4不是inner class的话,编译是完全通过的。
问题在return ic.new C4();这一句,在这里我们调用了C4的default constructor,但它的权限却是default,那就意味着除了package2以外
都无法调用该constructor,解决方法很简单,就是声明C4()为public
或是protected,这样就可见了。你同意我的说法吗?
import package1.*;public class B4 {
protected class C4 implements A4 {
public C4() {}
public void a4() { System.out.println("a4()"); }
}
}
and E12_InnerClass.java into:package package2;
import package1.*;public class E02_Interface implements A {
public void A1() { System.out.println("A1()"); }
public void A2() { System.out.println("A2()"); }
public void A3() { System.out.println("A3()"); }
public static void main(String[] args) {
E02_Interface i=new E02_Interface();
i.A1();
i.A2();
i.A3();
}
}
and then the compiler doesn't complain.