为什么我不能将另一个类的包私有方法称为同一个包中类的子类?

时间:2018-05-29 18:11:34

标签: java packages visibility

我在包A中有一个类Base,它定义了包私有方法foo()。在包B中,我有一个扩展Impl的课程Base。在包A中,如果我尝试在foo()的实例上调用Impl,则会出现编译错误。 (但是,我可以将Impl转换为Base然后调用它。)

我应该能够从包中调用foo()似乎是合理的,即使我调用它的对象是在包外定义的。我有什么理由可以吗?

2 个答案:

答案 0 :(得分:0)

你自己给出了答案。包A的A类中的方法foo()的状态“package private”不会因为你扩展这个类而结束。只要扩展类B派生自不同的包B,如果您尝试访问包A的A类中的方法foo(),编译器将抛出错误。

  

我不能有充分的理由吗?

因为这是Java的规则。

答案 1 :(得分:0)

是的,有充分的理由 - package-private隐藏您的实现,并将实现链接到实现所属的包。

实施A::foo()A包相关联,并且只能从包B:foo访问,而实施B只能从包java.lang访问。

您可以转换的内容,我们是否可以从每个超类的包中访问任何包私有实现;但这确实增加了包私有的范围。更不用说因为你的所有类都继承自java.lang.Object,所以每个包私有方法都可以从List<WebElement> link_boxes=driver.findElements(By.xpath("leaf-data-object-list[@id='objectList']/iron-list[@id='dataObjectList']/div[@id='items']")); 包中访问,这没什么意义!