Java 允许使用包(package)将类组织起来。借助于包,开发者可以方便地组织自己的代码,并将自己的代码与别人提供的代码库分开管理。
标准的 Java 类库分布在多个包中,包括 java.lang、java.util 和 java.net 等。标准的 Java 包具有一个层次结构,如同硬盘的目录嵌套一样,也可以使用嵌套层次组织包。所有标准的 Java 包都处于 java 和 javax 包层次中。
使用包的主要原因是确保类名的唯一性,只要将两个同名的类放在不同的包下,就不会产生冲突。事实上,为了保证包名的绝对唯一性,Sun 公司建议将公司的因特网域名以逆序的形式作为包名,并且对于不同的项目使用不同的子包。比如 com.aliyun.oss 与 com.aliyun.sms 就可以作为两个不同的项目包名使用。
Package 的作用
<<<CUSTOM
- 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免类名称冲突。
- 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
<<<END
Java 类的导入
一个类可以使用所属包中所有的类,以及其他包中的公有类(public class)。使用 import 语句可以导入一个类,并且,一旦使用了 import 语句,在使用指定类时,就不必写出包的全名了:
1 | // 未使用 import 语句之前 |
可以使用 import 语句导入一个特定的类或者整个包:
1 | import java.util.*; |
但是需要注意的是,只能使用星号(*)导入一个包,而不能使用 import java.* 或 import java.*.* 导入以 java 为前缀的所有包。
import 语句不仅可以导入类,还增加了导入静态方法和静态域的功能,比如:
1 | import static java.lang.System.*; |
Package 的作用域
我们都知道 ,Java 一共提供了 3 个访问控制修饰符,private、protected 和 public,分别代表了三种访问控制级别。另外还有一个不加任何访问控制修饰符的默认级别,称为 friendly。
访问控制修饰符的权限如下表:
<<<CUSTOM
| 访问作用域 | private | friendly | protected | public |
|---|---|---|---|---|
| 当前类 | √ | √ | √ | √ |
| 同包中的其他类 | × | √ | √ | √ |
| 不同包的其他类 | × | × | × | √ |
| 同包中的子类 | × | √ | √ | √ |
| 不同包的子类 | × | × | √ | √ |
- public:表示开放,数据成员和方法是对所有用户开放的,所有用户都可以直接进行访问;
- protected:表示保护,只有当前类,以及自己的子类、朋友可以访问,其他人不可以访问;
- friendly:包作用域,没有添加任何访问控制修饰符;
- private:表示私有,私有的意思就是除了当前类之外,任何人(包括子类)都不可以直接访问。
<<<END
注意:
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.* 开头的包往往由盈利性的公司发布,可能会有版权问题,使用时要注意。