为什么受保护的方法不可见?

时间:2014-08-15 20:48:33

标签: java

Java专家,我真诚地感谢任何见解!

我在一个带有受保护方法的包中有一个抽象类。我在同一个包中也有这个类的子类。现在,当我尝试从包外的类实例化子类时,并在子类上调用protected方法'例如,Eclipse抱怨受保护的方法不可见。

我认为,只要类可见性不限制它,所有子级都可以看到受保护的方法 - 包内或包外 - 在这种情况下,父类和子类都是公共的。我错过了什么?提前谢谢!

package X;
public abstract class Transformation {
  protected OutputSet genOutputSet (List list) {
    ..
  }
}


package X;
public class LookupTransformation extends Transformation {
}


package Y;
import X.*;
public class Test {
  public static void main(String[] args) {
    List<field> fld_list = new ArrayList();
    ..
    LookupTransformation lkpCDC = new LookupTransformation();
    OutputSet o = lkpCDC.genOutputSet(fld_list); // Eclipse errors out here saying genOutputSet from the Type Transformation is not visible. WWWWWWWWHHHHHAAAATTTTTT????
  }
}


4 个答案:

答案 0 :(得分:3)

protected访问意味着genOutputSet可以由继承自声明它的类的类或属于同一个包的类调用。这意味着您可以在LookupTransformation内调用它。

但是,您尝试从不相关的类Test调用它 - 位于不同的包中,这需要public访问权限。

请参阅其他说明here

答案 1 :(得分:1)

您的代码不在子类中(您在测试中),而您的代码不在中 相同的包裹(你在Y)。所以这个方法不可见。这很正常。

答案 2 :(得分:1)

protected表示您可以调用任何派生类中的方法。但是,Test并非来自TransformationgenOutputSet仅在内显示 TransformationLookupTransformation。在派生类的对象上调用方法时,这并没有说明方法的可见性。

答案 3 :(得分:1)

我能给出的最好的答案就是这张照片的形式,我过去常常自己学习:

enter image description here

Protected方法适用于其他inherited中的子类(在您的情况下为packages类)。但是,您从另一个类(而不是subclass)调用它。希望这有帮助!