Java学习笔记之访问权限修饰词

所有事物都具有某种形式的访问权限控制。Java中存在以下四种形式的权限修饰词:

  • public
  • private
  • protected
  • 包访问权限(friendly)
    publicprotectedprivate这几个Java访问权限修饰词在使用时,是置于类中每个成员的定义之前的——无论它是一个域还是一个方法。
    如果不提供任何访问修饰词,则意味着它是“包访问权限”。一般默认访问权限就是“包访问权限”。

public接口访问权限

使用关键字public,就意味着该成员变量和方法对每个人都是可用的。
例:
先创建一个Cookie

1
2
3
4
5
6
7
8
package 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
11
import 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
13
class 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包访问权限

默认访问权限没有关键字,就意味着是包访问权限,也就是当前包中的所有其他类对那个成员都有访问权限,但对于这个包之外的所有类却没有访问权限。