【问题标题】:What are variables without public, private or protected declared as?没有声明为 public、private 或 protected 的变量是什么?
【发布时间】:2011-11-19 00:57:15
【问题描述】:

如果不是:

private JButton theButton;

我这样定义一个字段:

JButton theButton;

有什么区别?

【问题讨论】:

    标签: java


    【解决方案1】:

    包。它们对同一包中的其他类可见。

    FWIW,我通常在这些上使用我自己的无操作 @Package 注释,只是为了清楚地表明我知道我在做什么——我不只是忘记了一些东西。尽管它是默认设置,但包访问在高质量代码中的使用可能比其他三种可能性中的任何一种都少——有一个很大的例外:

    在某些风格的单元测试中,希望能够访问通常是私有的方法或字段。提供访问的一种方法是将它们设置为包访问,并将单元测试类放在同一个包中(但通常在不同的“测试”目录树中)。一些开发人员认为这是不好的做法——一般来说,在测试中使用私有(或用于测试的包)方法是不好的。

    【讨论】:

      【解决方案2】:

      在 Java 中有公共、受保护、包(默认)和私有可见性;从最显眼到最显眼的顺序排列。

      如果不指定,默认可见性为package

      package mytest.myvisibility;
      
      public class MyClass
      {
          public int myPublicInt; // visible to all
          protected myProtectedInt; // visible to subclasses of MyClass and to other members of the mytest.myvisibility package
          int myPackageInt; // visible only to other members of the mytest.myvisibility package
          private int myPrivateInt; // visible only to MyClass objects
      }
      

      【讨论】:

      • 这并不完全正确(参见上面@LukeH 提供的Oracle 文档)。受保护的物品在当前包裹中也可见。
      • 更新——详细阐述了“包”的可见性,并使描述和代码示例中的可见性顺序保持一致。
      【解决方案3】:

      与 c 上的静态函数相同。仅在同一个文件中可见。

      【讨论】:

      • 这是错误的。它们是“包私有”,正如其他答案中已经详细说明的那样,这意味着它们不仅在同一个文件中可见,而且在同一个包的其他文件中也是可见的。
      【解决方案4】:

      这是一个有用的概述,显示了每个修饰符允许的访问:

      Modifier Class Package Subclass World
      public Y Y Y Y
      protected Y Y Y N
      no modifier Y Y N N
      private Y N N N

      第一个数据列表示类本身是否有权访问由访问级别定义的成员。如您所见,一个类总是可以访问它自己的成员。第二列指示与该类位于同一包中的类(无论其父级如何)是否可以访问该成员。第三列表示在这个包之外声明的类的子类是否可以访问该成员(即扩展这个类的类)。第四列表示是否所有类都可以访问该成员。

      Source (Oracle)

      【讨论】:

        猜你喜欢
        • 2014-09-22
        • 1970-01-01
        • 2020-07-31
        • 2017-08-21
        • 2021-05-11
        • 2010-10-11
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多