3

我有一些这样的场景:

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);

我不知道这两种方式有什么区别。

4

3 回答 3

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); 
 }   
于 2012-10-03T13:59:43.283 回答
1

带有受保护修饰符的实例变量和方法只能访问either in derived class或在other class in the same package..

因此,您可能Base class在不同的包pkg1中,并且您derived classesclass您使用的protected method包在同一个包pkg2中,different来自base类包pkg1..

然后通过上述属性,您将能够访问派生类的方法,因为它们在同一个包中..但是,由于它们base class在不同的包中,而且不是您的超类test class..它无法访问..

编辑:-好的,如果您无法更改您的Base Class..

for (BaseClass object : objects) {
    if (object instanceof Child1) {
        ((Child1)object).protectedMethod(other);

    } else if(object instanceof Child2) {
        ((Child1)object).protectedMethod(other);
    }
}

但是,这会从你的问题中消失所有多态的东西......这只是一种解决方法......

于 2012-10-03T13:59:46.980 回答
0

我会检查这个条目: Java Protected Method Accessibility

受保护仅限于同一个包裹和儿童。如果你需要访问包外的方法,它应该是公开的。

于 2012-10-03T14:01:38.233 回答