作者在前面章节简单介绍过访问权限控制的内容,前面《Java编程思想笔记一:基本概念》也有列出。Java 访问权限控制的等级从大到小依次是:public、protected、包访问权限(没有关键词)和 private。

一、包权限
一个 Java 源代码文件即一个 .java 文件,通常被称为编译单元(有时也称转译单元),在一个编译单元内最多只可以有一个 public 类,且该类名称必须与文件名相同。
包其实是一个库的单元,类库实际是一组文件,某个文件都有一个 public 类,以及任意数量的非 public 类。因此每个文件都有一个构件(每一个都有它们自己的独立的 .java 和 .class 文件),如果希望这些构件从属于同一个群组,就可以使用关键字 package。
包名
如果你的项目引用了项目 A 和 B,但是二者都有一个 tool 包,你的项目在使用 tool 包时就会出现包名冲突的问题,你必须通过某些额外的一些手段去解决。
为了有效避免包名冲突的问题,同时也为了更直观地管理一个包下面的所有 .class 文件,Java 利用操作系统的层次化的文件结构将特定包的所有 .class 文件都置于同一个目录下,而完整的文件路径就是包名。为了尽可能让我们的包名独一无二,按照惯例,package 的第一部分是类的创建者的反顺序的 Internet 域名,因为域名是独一无二的。
刚开始接触 Java 项目时很不习惯这一点,为什么一个包名搞这么复杂?读到这里终于明白了……
二、访问权限修饰词
包访问权限
没有使用任何访问权限修饰词的成员,具有包访问权限。即当前包中的所有其他类对该成员具有访问权限,但是对于包外所有类,这个成员却是 private。
public:接口访问权限
public 修饰的成员所有类都可以访问。
private:你无法访问
除了包含该成员的类外,其他任何类都无法访问。一般我们对外定义接口的时候,成员都是 private 权限,调用者想获取成员值或者给成员赋值,需要使用接口对外提供的 public 方法:
public class BaseElement {
private string name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Java 还提供了 @Data 注解,可以省去我们手动写这些 setName/getName 的方法,后面讲注解的时候作者会讲到。
private 还有一个常用的功能,就是可以控制如何构造一个对象,并阻止别人直接访问某个构造器:
class Sundae {
private Sundae() {}
static Sundae makeASundae() {
return new Sundae();
}
}
当我们想构造一个 Sundae 对象时,不可以直接访问默认构造器 Sundae(),只能通过类提供的静态方法 makeASundae 构造,由于是静态方法,所以只能构造一个 Sundae 对象,这就是我们实现单例的常用手段。
protected:继承访问权限
基类的创建者希望某个特定成员,把对它的访问权限赋予派生类而不是所有类,就使用 protected。protected 也提供包访问权限,即相同包内的其他类可以访问 protected 元素。
三、类的访问权限
上面主要讲了四种访问权限修饰词,都是讨论对类里的成员的作用,那么,它们对类本身的访问权限是如何限制的呢?总结了一下,主要有以下几点:
-
类既不可以是 private 的(这样会使其他如何类都不可以访问它 -- 只能自己玩,还有什么用?),也不可以是 protected 的(内部类除外,后面作者会讲);
-
类的访问权限只能是包访问权限或者 public 的。
网友评论