java包访问控制权限和公有静态成员变量该怎么理解?
伊谢尔伦
伊谢尔伦 2017-04-17 13:13:00
[Java讨论组]
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
ringa_lee

单看这句话完全是错误的!

没有任何办法(即使通过反射)可以在包外访问一个具有包访问控制权限的类的public static成员。

为了避免翻译问题,我专门去翻了英文原版,恍然大悟:结合上下文,作者在前面给出了一个单例的例子,而这句话还是接着那个例子说的

If you don’t 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.

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

ringa_lee

为什么public的不能访问呢。。。。就是字面上的意思啊。。。

巴扎黑

这应该只是java的一个语法吧。。。。
有包访问权限的对象可以由包内任何其他类来创建,但在包外则不行。
具体java里面是怎么处理这个,可能就需要去看Jvm规范的。。。

PHP中文网

一个是类的访问权限,一个是类中变量的访问权限。
先能访问到类,才能访问类中的变量,所以是一层包含一层的关系,外层可见才有可能见到内部。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号