敏捷冲冲_

The Art of software design

Java Package 详解

Java 允许使用包(package)将类组织起来。借助于包,开发者可以方便地组织自己的代码,并将自己的代码与别人提供的代码库分开管理。

标准的 Java 类库分布在多个包中,包括 java.lang、java.util 和 java.net 等。标准的 Java 包具有一个层次结构,如同硬盘的目录嵌套一样,也可以使用嵌套层次组织包。所有标准的 Java 包都处于 java 和 javax 包层次中。

使用包的主要原因是确保类名的唯一性,只要将两个同名的类放在不同的包下,就不会产生冲突。事实上,为了保证包名的绝对唯一性,Sun 公司建议将公司的因特网域名以逆序的形式作为包名,并且对于不同的项目使用不同的子包。比如 com.aliyun.oss 与 com.aliyun.sms 就可以作为两个不同的项目包名使用。

Package 的作用

<<<CUSTOM

  1. 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
  2. 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免类名称冲突。
  3. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

<<<END

Java 类的导入

一个类可以使用所属包中所有的类,以及其他包中的公有类(public class)。使用 import 语句可以导入一个类,并且,一旦使用了 import 语句,在使用指定类时,就不必写出包的全名了:

1
2
3
4
5
6
7
// 未使用 import 语句之前
java.util.Date now = new java.util.Date();

// 使用 import 方式导入类
import java.util.Date;

Date now = new Date();

可以使用 import 语句导入一个特定的类或者整个包:

1
import java.util.*;

但是需要注意的是,只能使用星号(*)导入一个包,而不能使用 import java.* 或 import java.*.* 导入以 java 为前缀的所有包。

import 语句不仅可以导入类,还增加了导入静态方法和静态域的功能,比如:

1
2
3
4
import static java.lang.System.*;

out.println("Hello world"); // 等同于 System.out.println
exit(0); // 等同于 System.exit

Package 的作用域

我们都知道 ,Java 一共提供了 3 个访问控制修饰符,private、protected 和 public,分别代表了三种访问控制级别。另外还有一个不加任何访问控制修饰符的默认级别,称为 friendly。

访问控制修饰符的权限如下表:

<<<CUSTOM

访问作用域 private friendly protected public
当前类
同包中的其他类 ×
不同包的其他类 × × ×
同包中的子类 ×
不同包的子类 × ×
  • public:表示开放,数据成员和方法是对所有用户开放的,所有用户都可以直接进行访问;
  • protected:表示保护,只有当前类,以及自己的子类、朋友可以访问,其他人不可以访问;
  • friendly:包作用域,没有添加任何访问控制修饰符;
  • private:表示私有,私有的意思就是除了当前类之外,任何人(包括子类)都不可以直接访问。

<<<END

注意:包作用域是指一个类允许访问同一个包中没有 public、private 修饰的 class,以及没有 public、protected、private 修饰的字段和方法。

Package 的命名规则

以 java.* 开头的是Java的核心包,所有程序都会使用这些包中的类;

以 javax.* 开头的是扩展包,x 是 extension 的意思,也就是扩展。虽然 javax.* 是对 java.* 的优化和扩展,但是由于 javax.* 使用的越来越多,很多程序都依赖于 javax.,所以 javax. 也是核心的一部分了,也随 JDK 一起发布。

以 org.* 开头的是各个机构或组织发布的包,因为这些组织很有影响力,它们的代码质量很高,所以也将它们开发的部分常用的类随 JDK 一起发布。 在包的命名方面,为了防止重名,有一个惯例:大家都以自己域名的倒写形式作为开头来为自己开发的包命名,例如百度发布的包会以 com.baidu.* 开头,w3c组织发布的包会以 org.w3c.* 开头,微学苑发布的包会以 net.weixueyuan.* 开头…… 组织机构的域名后缀一般为 org,公司的域名后缀一般为 com,可以认为 org.* 开头的包为非盈利组织机构发布的包,它们一般是开源的,可以免费使用在自己的产品中,不用考虑侵权问题,而以 com.* 开头的包往往由盈利性的公司发布,可能会有版权问题,使用时要注意。