类和字段的可见性之间的相互作用

时间:2010-03-10 13:33:52

标签: java packages visibility

我了解到一个类可以是public也可以是package-private(最后一个值是默认值)。类的字段也可以是公共字段或包私有字段。这些“状态”具有相同的含义。如果某些东西是包私有的,那么它只在同一个包中可见。它是公开的,从任何地方(从任何包装)都可以看到。

我不清楚这些状态是如何相互影响的。特别是我对以下两种情况感兴趣:

  1. 该类是公开的,但其字段是包私有的。这个字段只能从包中看到吗?

  2. 该类是包私有的,它有一个公共字段。哪个会唱这个领域?

  3. 一般情况下,我不明白为什么我们打扰一个类是公共的还是包私有的,如果在任何情况下,我们指出它是公共的还是包私有的类的任何单个组件(字段和方法)。

3 个答案:

答案 0 :(得分:5)

最严格的可见性适用。您的问题的答案是:

  1. 仅限套餐。
  2. 包类中的公共字段通常没有多大意义。

    有一些细微之处:封闭类可以读取私有嵌套类中的私有字段(尽管这会因为隐式添加合成访问器而导致性能下降)。

    Sun's tutorial中有关于可见性的简短说明。另请参阅嵌套类的部分。

    编辑:为了您的兴趣,反思也可以篡改可见性。

答案 1 :(得分:1)

  1. 如果该类是公开的,那么该类的所有成员都“可能”可见。但正如您所说,该字段只能在包中显示。

  2. 如果课程不可见,那么您将如何引用该字段?所以是的,它仅限于包装。

  3. 当然值得注意的是,大部分时间你不应该使用公共字段,除非它们是常量。

    当我第一次看到它时,我并不理解你的最后一点,但我认为你问为什么在你可以限制对方法的访问时设置限制性类访问修饰符是值得的。您不能依赖字段/方法来提供限制的一个原因是扩展类(可能在另一个包中)可能会增加方法的可见性。但如果他们看不到课程延长它那么你就安全了(r)。

答案 2 :(得分:1)

您可以将可见性视为层次结构。在看到任何成员或函数之前,必须允许您查看该类。考虑到这一点,您的两个方案解析为:

  1. 是的,同一个包中的类可以在公共类中查看包私有字段。
  2. 只有同一个包中的类才能在包私有类中看到公共成员和函数。
  3. 如果您正在编写您希望其他人使用的API,那么最好使用package private来隐藏有助于您的设计的类,但不要对API做出贡献。