【问题标题】:Why is the protected method not visible?为什么受保护的方法不可见?
【发布时间】:2014-10-09 15:17:08
【问题描述】:

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

我在一个包中有一个抽象类,它带有一个受保护的方法。我在同一个包中也有这个类的一个子类。现在,当我尝试从包外的类实例化子类并在子类的实例上调用受保护的方法时,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????
  }
}


【问题讨论】:

  • 太棒了——感谢大家的回复。那么在这种情况下,您是说我根本无法从 Test 类运行 genOutputSet 吗?
  • 另外,签名不匹配。
  • @BiAct - 您好,只是更新您是否要选择答案,以便我们关闭此问题。 :-)

标签: java


【解决方案1】:

protected 访问意味着genOutputSet 可以被从声明它的类继承的类或属于同一包的类调用。这意味着您可以从LookupTransformation 中调用它。

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

见补充说明here

【讨论】:

  • 所以我可以这样做 - public class newLookupTransformation extends LookupTransformation { .. OutputSet o = this.genOutputSet(list); }
    公共类测试{ newLookupTransformation nlkp = new newLookupTransformation(); }
【解决方案2】:

我能给出的最佳答案是这张我曾经自己学习过的图片的形式:

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

【讨论】:

    【解决方案3】:

    protected 表示您可以调用任何派生类中的方法。但是,Test 不是从 Transformation 派生的。 genOutputSet 仅在内部 TransformationLookupTransformation 可见。当在派生类的对象上调用方法时,这并不能说明方法的可见性。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-09-14
        • 2018-03-24
        • 1970-01-01
        • 2019-02-13
        • 2019-10-09
        • 2014-11-10
        • 2011-01-18
        相关资源
        最近更新 更多