开发者社区> 问答> 正文

java包访问控制权限和公有静态成员变量该怎么理解?

《thinking in java》中有这么一段话:

正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。(一定要记住,相同目录下的所有不具有明确package声明的文件,都被视作是该目录下缺省包的一部分。)然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象

其中最后一句话该怎么理解? 如果一个类是默认的包访问控制权限,那么这个类只能在包中被访问,而客户端程序员一定是在一个新的包中试图访问该对象,按照我的理解是不应该访问到该类的,所以尽管其中有public static成员变量,也是无法访问的。
我的理解有什么问题吗?

展开
收起
蛮大人123 2016-02-28 14:36:25 2742 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    单看这句话完全是错误的!
    没有任何办法(即使通过反射)可以在包外访问一个具有包访问控制权限的类的public static成员。
    为了避免翻译问题,我专门去翻了英文原版,恍然大悟:结合上下文,作者在前面给出了一个单例的例子,而这句话还是接着那个例子说的

    If you dont want anyone else to have access to that class,
    you can make all the constructors private

    //: c05:Lunch.java
    // Demonstrates class access specifiers. Make a class
    // effectively private with private constructors:
    
    class Soup {
      private Soup() {}
      // (1) Allow creation via static method:
      public static Soup makeSoup() {
        return new Soup();
      }
      // (2) Create a static object and return a reference
      // upon request.(The "Singleton" pattern):
      private static Soup ps1 = new Soup();
      public static Soup access() {
        return ps1;
      }
      public void f() {}
    }
    
    class Sandwich { // Uses Lunch
      void f() { new Lunch(); }
    }
    
    // Only one public class allowed per file:
    public class Lunch {
      void test() {
        // Can't do this! Private constructor:
        //! Soup priv1 = new Soup();
        Soup priv2 = Soup.makeSoup();
        Sandwich f1 = new Sandwich();
        Soup.access().f();
      }
    } 

    后面单拎出来这个函数来讲,该类的某个static成员是public的话指代的也是这部分内容

    public static Soup access() {
      return ps1;
    }

    The class Soup shows how to prevent direct creation of a class

    by making all the constructors private.

    上下文非常明确,不能生成该类的对象不是因为题主想当然的一定是在一个新的包中试图访问,而是在同一个包,因为构造函数被定义为私有而无法创建实例

    2019-07-17 18:49:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载