《thinking in java》中有这么一段话:
正如前面所提到的,如果没能为类访问权限指定一个访问修饰符,它就会缺省得到包访问权限。这意味着该类的对象可以由包内任何其他类来创建,但包外则是不行的。(一定要记住,相同目录下的所有不具有明确package声明的文件,都被视作是该目录下缺省包的一部分。)然而,如果该类的某个static成员是public的话,则客户端程序员仍旧可以调用该static成员,尽管他们并不能生成该类的对象
其中最后一句话该怎么理解? 如果一个类是默认的包访问控制权限,那么这个类只能在包中被访问,而客户端程序员一定是在一个新的包中试图访问该对象,按照我的理解是不应该访问到该类的,所以尽管其中有public static成员变量,也是无法访问的。
我的理解有什么问题吗?
单看这句话完全是错误的!
没有任何办法(即使通过反射)可以在包外访问一个具有包访问控制权限的类的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.
上下文非常明确,不能生成该类的对象不是因为题主想当然的一定是在一个新的包中试图访问,而是在同一个包,因为构造函数被定义为私有而无法创建实例
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。