- 访问控制(或隐藏具体实现)与“最初的实现并不恰当”有关。
- 重构即重写代码,以使得它更可读,更容易理解,并所以而更具维护性。
- 在面向对象设计中须要考虑一个基本问题:“如何把变更的事物与保持不变的事物区分开来”
- 应该尽量将一切方法都定为
private
,而仅向客户端程序员公开你愿意让他们使用的方法。
包:库单元
- 包内包含有一组类,它们在单一的名字空间之下被组织在一块儿
- 为了解决潜在的名字冲突问题,Java使用 package 对名称空间进行彻底控制并为每个类建立惟一的标识符组合。
- 每个编译单元(.java 文件)只能有一个 public 类。
- 当编译一个 Java 文件时,.java 文件中的每个类都会生成一个与其类名相同的 .class 文件
- Java 可运行程序是一组能够打包并压缩为一个 Java 文档文件(JAR)的 .class 文件,Java解释器负责这些文件的查找、装载和解释。
- 类库实际上一组类文件。其中每一个文件都有一个 public 类,以及任意数量的非 public 类。所以每一个文件都有一个构件,若是但愿他们都属于同一个群组,则可使用关键词 package。
- package 语句必须是文件中除了注释外的第一行代码。如
packgae access;
表示当前文件是 access 类库的一部分,标识符为access.ClassName
;
- package 名称的第一部分应该是域名的逆序。
- package 名称会被分解为一个目录路径,这个包的全部文件都应该放在该文件夹中,例如包名为
fun.wuxiaobai24.access
,则被解释成$CLASSPATH/fun/wuxiaobai24/access
,其中$CLASSPATH
为环境变量,CLASSPATH 能够指定多个目录。
- 在使用JAR文件时,须要在 CLASSPATH 中指明JAR文件的真实路径,如
CLASSPATH = .;~/jar/access.jar
- 若是将两个包含相同名称的类库用
*
形式导入时,在使用重名的类时,须要指明是那个包中的,如fun.wuxiaobai24.access.ClassName c = new fun.wuxiaobai24.access.ClassName()
- 使用
import static
语句进行静态导入,将某个包中的全部静态方法导入,这样能够直接用静态方法名进行方法调用,而不用在前面加类名,如调用某个类中的 main() 方法时,静态导入能够直接main();
,而普通的导入而须要ClassName.main();
- Java 中 没有 C 中的条件编译,可是能够用 import 来间接实现某些功能。
Java 访问权限修饰词
- 包访问权限容许将包内全部相关的类组合在一块儿,以使得它们彼此之间能够相互访问做用。
- 继承而来的类能够访问
public
和protected
,只有当两个类在同一个包中时才能访问包访问权限的成员。
- 对于OOP而言,提供访问器和变异器(getter/setter),以读取或改变数值是最优雅的方法,而是 JavaBean 的基本原理。
- 若是没有给文件指定包,Java 将这些文件视为该目录的默认包中,因而给该目录中全部其余的文件提供包访问权限。
- 不能由于在类中某个对象的引用是 private,就认为其余对象就不能拥有该对象。
- protected 成员除了继承的子类能够访问外,它也有包访问权限,即同一个包下的类能够访问它。
- private 能够用来实现单例子模式:
class Soup {
private Soup() {}
private static Soup soup = new Soup();
public static Soup access() {
return soup;
}
}
接口和实现
访问权限的控制常被称为具体实现的隐藏。把数据和方法包装进类中,以及具体的实现的隐藏,常共同被称为封装。其结果是一个同时带有特征和行为的数据类型。java
访问权限控制将权限的边界划在数据类型的内部的缘由:程序员
- 不用担忧客户端程序员偶然地将内部机制看成他们可使用的接口的一部分。
- 接口和具体实现的分离
类的访问权限
为了控制类的访问权限,修饰词必须出如今关键词 class 以前,如public class ClassName
。同时有一些额外的限制:设计
- 每一个编译单元(文件)都只能有一个 public 类。每一个编译单元都有单一的公共接口,同 public 类实现
- public 类的名称必须与文件名相同,包括大小写。
- 编译单元(文件)中能够彻底不带 public 类,此时能够随意对文件命名。
类的访问权限只有 public 和包访问权限。若是但愿其余任何人对该类有访问权限,能够将全部的构造器都指定为 private,可是该类中 static 成员仍然能够建立和访问。code
本文首发于Code & Fun对象