【问题标题】:Interplay between visibility of class and fields类和字段的可见性之间的相互作用
【发布时间】:2011-01-25 21:49:03
【问题描述】:

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

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

  1. 该类是公共的,但它的字段是包私有的。此字段是否仅在包内可见?

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

一般来说,我不明白为什么我们会为一个类是公共的还是包私有的而烦恼,无论如何,对于一个类的任何单个组件(字段和方法),我们指出它是公共的还是包私有的。

【问题讨论】:

  • 我认为您在第一段中的意思是“在同一个包中”而不是“在同一个类中”。
  • @Jon Skeet,你是​​对的。感谢您的评论。

标签: java packages visibility


【解决方案1】:

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

  1. 是的。
  2. 仅限包装。

包类中的公共字段通常没有多大意义。

有一些微妙之处:私有嵌套类中的私有字段可以被封闭类读取(尽管这会由于隐式添加合成访问器而导致一些性能损失)。

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

编辑:为了您的兴趣,反射还允许篡改可见性。

【讨论】:

  • Xr,但在第一种情况下,字段可见性会覆盖类可见性。该字段是包私有的,类是公共的,因此该字段仅在“本机”包中可见。
  • 正确。实际上,这是最严格的。我把第一句话搞砸了(修正了它),但我的答案的其余部分仍然成立。
【解决方案2】:
  1. 如果该类是公共的,则该类的所有成员都“可能”可见。但正如您所说,该字段仅在包中可见。

  2. 如果类不可见,您将如何引用该字段?所以是的,它将仅限于包裹。

当然值得注意的是,大多数时候你不应该使用公共字段,除非它们是常量。

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

【讨论】:

  • 所以,如果一个类是“公共的”,那么所有字段都可能是公共的,如果我们在这些字段前面使用“public”修饰符,该字段将是真正的公共。如果一个类是包私有的,那么字段的修饰符就没有任何意义(无论我们使用什么字段修饰符,这个字段总是包私有的)。
  • 是的“潜在公开”部分。对于包私有的东西没有。在这种情况下,“受保护”和“私有”仍然保持其含义。
  • 没错。在第二种情况下,该字段当然可以是包私有或私有的。
  • 我不认为可以保护它可以吗?因为受保护的限制比默认少。
  • 假设一个包私有类“Parent”有一个受保护的字段“foo”。来自同一个包的公共类“Sub”扩展了它。它可以访问 foo。来自另一个包的类“SubSub”扩展了 Sub。即使 foo 属于包私有类,它也可以访问 foo。子类增加了 foo 的可见性,而无需明确触及其定义。
【解决方案3】:

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

  1. 是的,同一包中的类可以看到公共类中的包私有字段。
  2. 只有同一个包中的类才能看到包私有类中的公共成员和函数。

如果您正在编写希望其他人使用的 API,最好使用包私有来隐藏有助于您的设计但不参与 API 的类。

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多