访问权限控制
6.1包:库单元
包内包含有一组类,它们在单一的名字空间之下被组织在了一起。
6.1.1 包:类库单元
包内含有一组类,它们在单一的名字空间之下被组织在了一起。比如,在Java的标准发布中有一个工具库。它被组织在java.util名字空间之下。java.util有一个叫做ArrayList的类,使用ArrayList的一种方式是用其全名java.util.ArrayList 或者转而使用 import关键字。
6.2访问权限修饰词
6.2.1包访问权限
如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。这意味着当前的包中的所有其他类对那个成员都有访问权限,但对这个包之外的的所有类,这个成员却是private的。
一般来说取得某成员的访问权的唯一途径是:
1、使该成员成为public
2、通过不加访问权限修饰词并将其他类放置在同一个包内。获得包访问权。
3、继承。但是只能访问public以及protected的。
4、提供访问器(accessor)和变异器(mutator)方法(也就是set、get),以读取和改变数值。
6.2.2 public
public:接口访问权限。使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人都是有用的。
6.2.3 private
你无法访问。除了包含该成员的类之外,其他任何类都无法访问这个成员。同处于一个包内的其他类也是不能够访问private成员的。如果将类的构造器都是private的,那么它将阻碍对此类的继承。
6.2.4 protected
protected:类的创建者可以将某个特定成员。把它的访问权限赋予给派生类而不是所有类。protected也提供包访问权限。相同包内的其他类可以访问protected元素。
权限由大到小顺序:public——>protected——>包——>private
6.3接口和实现
访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常共同被称为是封装。
访问权限控制将权限的边界划在了数据类型的内部。
- 第一个原因是要设定客户端程序员可以使用和不可以使用的界限。可以在结构中建立自己的内部机制,而不必担心客户端程序员会偶然地将内部机制当作是他们可以使用的接口的一部分。
- 第二个原因就是接口和具体实现的分离。如果结构是用于一组程序之中,而客户端程序员除了可以向接口发送信息之外什么也不可以做,那么就可以随意更改所有不是public的东西,而不会破坏客户端的代码。
6.4类的访问权限
- 每个编译单元中只能有一个public类。
- public类的名称必须与类文件名相同。
- 类中可以完全不带public类,此时文件可以任意命名。
类只能是包权限或者public权限。
如果把构造器指定为private的话,别人就无法创建这个类的对象了。 name别人怎么获取这个类的对象呢?
可以创建一个static方法,返回这个类的引用。(单例模式)
控制对成员的访问权限的原因:
1)为了是用户不触碰他们不应触碰的部分。
2)接口与实现的分离,设计者改变类实现的时候不用担心对使用者造成影响。