[英]Protected inner-class is NOT accessible from subclass of another package
我在Java中有以下代码:
package a;
public classs ClassInOtherPackage{
protected void protectedMethod(){}
protected class protectedInnerClass {}
}
package b;
import a.*;
public class MyClass extends ClassInOtherPackage{
public MyClass(){
MyClass x = new MyClass();
x.protectedMethod(); //<-- This one ok
//UPDATED: Declaration is ok
MyClass.protectedInnerClass y; //<-- This one ok
//UPDATED: Only when instantiated is not allowed, why?
y = x.new protectedInnerClass(); //<-- Not allow when instantiated.
}
}
请参阅Java文档:
“protected修饰符指定只能在自己的包中访问该成员(与package-private一样),此外,还可以在另一个包中通过其类的子类访问。”
为什么我不能实例化如上所示的内部受保护类?
8.8.9。 默认构造函数
...如果该类被声明为
protected
,则默认构造函数被隐式赋予访问修饰符protected
( §6.6 ); ...
所以隐式声明的构造函数是:
protected class protectedInnerClass {
protected protectedInnerClass(){
super();
}
}
您的代码将无法编译,因为构造函数不可访问。
protectedInnerClass
的默认构造函数是protectedInnerClass
protected
,而不是类。 您需要为内部类定义一个public
构造函数:
protected class protectedInnerClass {
public protectedInnerClass () {}
}
MyClass
可以访问ClassInOtherPackage
的protected
成员,但它无法访问protected
的protectedInnerClass
protected
成员,因为它的构造函数protected
因此会出现这样的编译错误。
正如johnchen902所说,受保护类的默认构造函数是隐式保护的。 受保护意味着只有同一个包中的子类和类才能访问它。
所以你必须公开它,或者你可以像这样修改你的代码:
public class MyClass extends ClassInOtherPackage {
public MyClass() {
MyClass x = new MyClass();
x.protectedMethod(); // <-- This one ok
MyClass.protectedInnerClass y = x.new MyProtectedInnerClass();
}
protected class MyProtectedInnerClass extends protectedInnerClass {
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.