权限包:库单元
当编写一个Java源代码文件时,此文件通常被成为编译单元(有时也成为转移单元)。每个编译单元都必须有一个后缀名 .java ,而在编译单元内则可以有一个 public 类,该类的名称必须与文件的名称相同。如果该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的。
代码组织
当编译一个 .java 文件时,在 .java 文件中的每个类都会有一个输出文件,后缀为 .class 。
类库实际上是一组类文件。其中每一个文件都有一个 public 类,以及任意数量的非 public 类。因此每个文件都有一个构件。
Java 访问权限修饰词
------ | private | default | protected | public |
---|---|---|---|---|
同一类 | y | y | y | y |
同一包中的类 | y | y | y | |
子类 | y | y | ||
其他包中的类 | y |
包访问权限
默认访问权限没有任何关键字,意味着当前的包中的所有其他类对那个成员都有访问权限,对于包之外的所有类,这个成员是 private 。
取得对某成员的访问权的唯一途径是:
- 使该成员成为 public。
- 通过不添加访问权限修饰符并将其他类放置于同一个包内的方式给成员赋予包访问权。
- 使用继承技术,访问超类的 public 和 protected。
- 提供访问器( accessor )和变异器( mutator ) 方法(也称作 get/set )。
接口访问权限
使用关键字 public ,这意味着 public 之后紧跟着的成员声明自己对每个人都是可用的。
无法访问
关键字 private 的意思是,除了包含该成员的类之外,其他任何类都无法访问这个成员。
继承访问权限
和 default 包对比可以容易理解,较 default 多了子类可以访问的权限。
接口和实现
访问权限的控制常被成为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称作是封装。
类的访问权限
除了要将权限修饰词放在关键字 class 之前,还有一下限制:
- 每个编译单元,都只能有一个 public 类。
- public 类的名称必须完全与含有编译单元的文件名相匹配。
- 一种不常用的情况,编译单元不带 public 类的时候,可以随意对文件命名。
在创建一个包访问权限的类时,仍旧是在将该类的域声明为 private 时才有意义。有包访问权限的类通常只能被用于包内。
总结一句:类既不可以是 private 的,也不可以是 protected 的。当然,一个内部类可以是 private 或 protected,这里先不谈。
所以对类的访问权限,仅有包访问权限或 public ,如果不希望其他任何人对类拥有访问权限,可以把所有构造器都指定为 private。
需要注意:没有给类指定一个访问修饰符,会得到默认的包访问权限。意味着该类的对象可以由包内任何其它类来创建,但在包外则是不行的。然而如果该类的某个 static 成员是 public 的话,则可以调用该 static。