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.
单看这句话完全是
错误的!没有任何办法(即使通过
反射)可以在包外访问一个具有包访问控制权限的类的public static成员。为了避免翻译问题,我专门去翻了英文原版,恍然大悟:结合上下文,作者在前面给出了一个
单例的例子,而这句话还是接着那个例子说的后面单拎出来这个函数来讲,
该类的某个static成员是public的话指代的也是这部分内容上下文非常明确,不能
生成该类的对象不是因为题主想当然的一定是在一个新的包中试图访问,而是在同一个包,因为构造函数被定义为私有而无法创建实例为什么public的不能访问呢。。。。就是字面上的意思啊。。。
这应该只是java的一个语法吧。。。。
有包访问权限的对象可以由包内任何其他类来创建,但在包外则不行。
具体java里面是怎么处理这个,可能就需要去看Jvm规范的。。。
一个是类的访问权限,一个是类中变量的访问权限。
先能访问到类,才能访问类中的变量,所以是一层包含一层的关系,外层可见才有可能见到内部。