对于成员(域、方法、嵌套类和嵌套接口)有四种可能的访问级别,下面按照可访问性的递增顺序罗列出来:
私有的(private)——只有在声明该成员的顶层类内部才可以访问这个成员。
包级私有的(package-private)——声明该成员的包内部的任何类都可以访问这个成员。从技术上讲,它被称为“缺省”(default)访问级别,如果没有为成员指定访问修饰符,就采用这个访问级别(当然,接口成员除外,它们默认的访问级别是公有的)。
受保护的(protected)——声明该成员的类的子类可以访问这个成员(但有一些限制,并且声明该成员的包内部的任何类也可以访问这个成员。
公有的(public)——在任何地方都可以访问该成员。
注意,长度非零的数组总是可变的,所以让类具有公有的静态 final 数组域,或者返回这种域的访问方法,这是错误的。如果类具有这样的域或者访问方法,客户端将能够修改数组中的内容。这是安全漏洞的一个常见根源:
// Potential security hole!
public static final Thing[] VALUES ={ ... };
要注意,许多 IDE 产生的访问方法会返回指向私有数组域的引用,正好导致了这个
问题。修正这个问题有两种方法。可以使公有数组变成私有的,并增加一个公有的不可变
列表:
private static final Thing[] PRIVATE_VALUES ={... };
public static final List VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
另一种方法是,也可以使数组变成私有的,并添加一个公有方法,它返回私有数组的
一个拷贝:
private static final Thing[] PRIVATE_VALUES ={ ... };
public static final Thing[] values( ){
日
return PRIVATE_VALUES.c1one();
}



