我有一些这样的场景:
public class BaseClass {
protected void protectedMethod(OtherObject object) {
...
}
}
public class Child1 extends BaseClass {
@Override
protected void protectedMethod(OtherObject object) {
super.protectedMethod(object);
// Custom Child1 logic
...
}
}
public class Child2 extends BaseClass {
@Override
protected void protectedMethod(OtherObject object) {
super.protectedMethod(object);
// Custom Child2 logic
...
}
}
然后当我调用“protectedMethod”迭代一个“BaseClass”对象数组时,编译器给了我受保护的访问错误:
OtherObject other = new OtherObject();
BaseClass[] objects = {
new Child1(),
new Child2()
}
for (BaseClass object : objects) {
object.protectedMethod(other); //this line gives me protected access error
}
但是如果我以不同的非多态方式做同样的事情,它就可以正常工作。
OtherObject other = new OtherObject();
Child1 child1 = new Child1();
Child2 child2 = new Child2();
child1.protectedAccess(other);
child2.protectedAccess(other);
我不明白这两种方式有什么不同。
答案 0 :(得分:3)
在Java中,''protected''访问限定符不仅允许子类访问,还允许访问同一包中的其他类。
如果您的上一个代码段与Child1和Child2位于同一个包中,则它可以访问Child1和Child2中的受保护方法。
修改强>
您可以通过在自己的包中引入自己的基类来解决此问题并保持多态性。
public MyBaseClass extends BaseClass {
@Override
protected void protectedMethod(OtherObject object) {
super.protectedMethod(object);
}
}
public Child1 extends MyBaseClass { ... }
public Child2 extends MyBaseClass { ... }
然后使用您自己的基类类型的集合。
NyBaseClass[] objects = {
new Child1(),
new Child2()
}
for (MyBaseClass object : objects) {
object.protectedMethod(other);
}
答案 1 :(得分:1)
具有受保护修饰符的实例变量和方法只能访问either in derived class
或other class in the same package
..
因此,您的Base class
可能位于不同的包 pkg1 中,您的derived classes
和class
可能位于您使用的{ {1}}位于protected method
类包different
的同一个包 pkg2 ,base
中。
然后通过上面的属性,你可以访问派生类的方法,因为它们在同一个包中。但是,因为pkg1
在不同的包中,也不是你{{1}的超类1}} ..无法访问..
编辑: - 好的,如果您无法更改base class
,
test class
但是,这会从你的问题中消除所有多态的东西......这只是一种解决方法..
答案 2 :(得分:0)
我会查看此条目: Java Protected Method Accessibility
受保护仅限于同一个包和儿童。如果您需要访问包外的方法,它应该是公共的。