- 在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词。Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public。其权限控制如下表:
- 其中,默认情况下没有任何修饰词,这样的类成员具有“包访问权”,即位于同一个包中的类对其有访问权;而protected为“继承访问权”,即该类的子类对其具有访问权(同时,位于同一个包中的类也对其具有访问权)。
- 而对于Java中的“类”(不是其内部成员,两者要区分开),其访问权限修饰词仅有public和“无”(即包访问权)两种,而没有private和protected(有 一个特例,就是“内部类”,其可以是private或protected的)。所以对于类的访问权限,你仅有两个选择:包访问权或是public。如果你 不希望其他任何人对该类拥有访问权,你可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象。但是有一个例外,就是在该类的 static成员内部进行创建。如下例:
class Soup {
//构造函数是private的!
private Soup() {}
//怎么实例化?
//方式一:可以通过静态方法创建Soup的对象
public static Soup makeSoup() {
return new Soup();
}
//方式二:在类的static成员内部用new方式创建实例对象
//单例模式:单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。
//特点:
//1.一个类只有一个实例
//2.自己创建这个实例
//3.整个系统只能用这个实例
private static Soup ps1 = new Soup();
public static Soup access() {
return ps1;
}
public void f() {}
}
class Sandwich { // 吃午餐
void f() {
/new 类名(),这种写法是匿名内部类,则只能创建匿名内部类的一个实例。
new Lunch();
}
}
//只有公有类允许所以文件访问
public class Lunch {
//定义一个test方法
void test() {
// 不能这样做,构造函数是私有的
//! Soup priv1 = new Soup();
Soup priv2 = Soup.makeSoup();
Sandwich f1 = new Sandwich();
Soup.access().f();
}
}
ps:关于需要注意的点,博主已经注释在相应的代码位置,请对照《Thinking In Java》书中内容,可作为参考文档阅读,发现问题,请观众老爷指正!