Java成长之路六
封装
- 访问控制(Access control())或者隐藏实现(implenmentation hiding),都与最初的实现不恰当有关;
- Java提供语句修饰符(access specifier)供类库开发者指明哪些对于客户端是可用的,哪些对于客户端是没用的;
- public-protect-包访问权限(package access)(没有关键字)和private;
- Java中package关键字加以控制,类在相同包下还是在不同包下,会影响访问修饰符;
包的概念
- 包内包含一组类,它们被组织在一个单独的命名空间中;
- 使用Import导入包,为了提供一种管理命名空间的机制。所有类名之间是相互隔离的。
- 为了解决冲突,我们为每个类创建一个唯一标识符组个;
- 一个Java源代码文件称一个编译单元(complication unit),每个编译单元的文件名后缀必须是.java;
- 每个编译单元中只能有一个Public类,否则编译器受不了,还有其他类,在包外是无法访问到这些类的,主public类需要提供“支持”类;
代码组织
- 在Java中,可运行程序是一组.class文件,它们可以打包压缩成一个java文件(Jar,使用jar文档生成器);Java解释器负责查找,加载和解释这些文件;
- 类库是一组文件,由public类和任意数量额非public类组成,如果把这些组件集中在一起,需要使用关键字package;
创建独一无二的包名
- 当编译器遇到Import语句时,它会在CLASSPATH指定目录中查找子目录;
- 若导入相同类名的代码,会出现冲突这时候需要指明应用包;
- 使用import来改变一些行为,比如将调试版改为发布版;
- 每个访问修饰符只能控制它们修饰的对象;
包访问权限
- 一个编译单元(即一个文件),只能隶属于一个包,通过包访问权限,位于同一编译单元中的所有类彼此之间都是可访问的;
若想看到protected包和private成员
- 使成员成为public;
- 赋予成员默认包的访问权限,不加任何修饰类,然后将其他类放在相同的包中;
- 使用继承的类可以访问public成员也可以访问protected成员;
- 提供访问器(accessor)和修改器(mutator)方法(称为”get/set”方法)从而读取或改变值;
public访问权限
- 当用关键字public, 此表明每个成员都是可用的;
private你无法访问
- private意味着除了包含该成员的类,其他任何类都无法访问这个成员;
- 同个包也无法访问private成员,自己隔离自己,另一方面创建包也是有可能的;
- 使用类,客户端程序员无法访问包访问权限成员;
- 使用private是非常重要的,尤其是多线程环境中;
protected继承访问权限
- protected 处理的是继承的概念;通过继承可以利用一个现有的类——我们称为积累,然后添加新成员到现有类中而不必改变现有类,我们还可以改变类的现有成员的行为,为从一个类继承,需要声明心类extends一个现有类;
- 当你定义一个具有包访问权限的类时,你可以在其中定义一个public构造器;
接口与实现
- 访问控制通常被承称为隐藏实现(implementation hiding),将数据和方法包装进类中并具体实现隐藏被称作是封装,其结果就是一个同时常有特征和行为的数据类型;
- 有两个原因,访问控制内部划定了界限;1.确定客户端程序员可以使用和不能使用的边界;2.将接口与实现分离;
- 创建类的风格;
public
->protected
->private
;
类访问权限
- 访问权限修饰符可以确定类库中的哪些类库的使用者是可用的;
- 类的访问权限可以是:包访问权限或者public,为了防止类被外界访问,可以将所有构造器的声明为private,这样只能自己的创建对象(在类的static对象中)
- 如果不显式地创建构造器,编译器会自动创建一个无参构造器;
类的限制
- 每个编译单元(即每个文件)中只能有一个Public类;
- public类的名称必须与含有该编译单位的文件名相同,包括大小写;
- 虽然不常见,但是编译单元没有public类也是可能的;