所有事物都具有某种形式的访问权限控制。Java中存在以下四种形式的权限修饰词:
public
private
protected
- 包访问权限(friendly)
public
、protected
和private
这几个Java访问权限修饰词在使用时,是置于类中每个成员的定义之前的——无论它是一个域还是一个方法。
如果不提供任何访问修饰词,则意味着它是“包访问权限”。一般默认访问权限就是“包访问权限”。
public接口访问权限
使用关键字public
,就意味着该成员变量和方法对每个人都是可用的。
例:
先创建一个Cookie
类1
2
3
4
5
6
7
8package access.dessert;
public class Cookie {
public Cookie() {
System.out.println("Cookie constructor");
}
void bite() { System.out.println("bite"); }
}
在创建一个使用Cookie
类的程序1
2
3
4
5
6
7
8
9
10
11import access.dessert.*;
public class Dinner {
public static void main(String[] args) {
Cookie x = new Cookie();
//! x.bite(); // Can't access
}
}
/* Output:
Cookie constructor
*/
从上面程序可以看到,由于bite()
没有任何访问修饰词,故其默认为包访问权限,即只向在dessert
包中的类提供访问权,所以bite()
在Dinner.java
之中是无法访问的。
private你无法访问
使用关键字private
,就意味着,除了包含该成员的类外,其他任何类都无法访问这个成员。
默认的包访问权限通常已经提供了充足的隐藏措施(使用类的客户端程序员是无法访问包访问权限成员的)。而private
在多线程环境下将会有更重要的应用。
例:1
2
3
4
5
6
7
8
9
10
11
12
13class Sundae {
private Sundae() {}
static Sundae makeASundae() {
return new Sundae();
}
}
public class IceCream {
public static void main(String[] args) {
//! Sundae x = new Sundae();
Sundae x = Sundae.makeASundae();
}
}
可能你想控制如何创建对象,又想阻止别人直接访问某个特定的构造器。则可以用private
修饰构造函数,这样就禁止通过构造函数来创建Sundae
对象,必须通过makeASundae()
方法来达到此目的。
protected继承访问权限
使用关键字protected
,就意味着基类的protected成员只有派生类能够访问(同一包内的其他类也可以访问)。
friendly包访问权限
默认访问权限没有关键字,就意味着是包访问权限,也就是当前包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类却没有访问权限。