2.2 使用包组织类
所有JVM语言都定义了其创建类和实例化对象的语法,但它们生成的类文件最终都将在JVM上运行。为了能够在JVM上运行以及与使用其他JVM语言编写的类互操作,必须遵循JVM在类组织方面的要求。本节将讨论如下主题:
- 包;
- 选择包名;
- 包名举例;
- 全限定类名。
要明白Java类库的组织方式以及如何从命令行运行JVM应用程序,必须对包有所了解。这两个主题都将在本章讨论。
2.2.1 包是什么
本书介绍的语言大都支持将类组织成包。位于同一个包中的类构成了一个独特的命名空间,这是JVM最重要的特征。有些语言本身不支持将类组织成包,但支持引用包中的类。
一个这样的例子是Oracle的JavaScript解释器Nashorn。JavaScript语言本身不支持包,但Nashorn能够导入放在包中的Java(或其他兼容)类。
为演示如何将类组织成包,下面再来看看电子商务应用程序中购物车的实现,但这里的示例将更成熟些。

JVM提供了一种对类进行组织的方式——将它们放在包中。通过这样做,可将主题相同的类编组。就刚才的示例而言,将涉及的类放在下面这些包中比较合理。
| 包 | 包中的类 |
|---|---|
basket
|
Basket、BasketLine
|
product
|
Product
|
user
|
User
|
之所以选择这种组织方式,是因为我认为这些类的主题分别为购物车、商品和用户。另外,我预计未来Basket、Product和User类将被其他类使用,而BasketLine类只会在Basket类内部使用。
通过使用包,不仅可让大型项目的结构更容易理解(这一点你将在稍后看到),还可通过使用访问修饰符对其他包中的类隐藏类成员。
要高效地使用包,必须了解几乎所有JVM项目都遵循的约定。虽然上表选择的包名完全合法,但给包命名时应遵循一定的约定。
2.2.2 选择包名
包名必须遵守如下几个规则。
- 包名可包含句点;实际上,句点用于分隔名称中的不同元素。
- 包名中的元素可包含字母、数字和下划线。
- 包名中的每个元素都必须以字母打头,而不能以数字打头(数字只能跟在字母后面)。
- 包名中的元素不能是Java保留的关键字,这包括基本类型的名称(如
int、short)以及内置关键字(如class、for和final)。
有一些大多数重要项目都遵守的通用命名约定。在所有项目中,都强烈建议你在给包命名时遵守如下约定。
- 整个包名都为小写。
- 包名以如下URL打头。
- 公司网站的URL。
- 项目网站的URL。
- 项目公开源代码仓库的URL。
- 个人主页或博客的URL。
- 你可制定自己的约定,以便将不同的类区分开来,避免不同的项目发生命名冲突。为此,可在包名中添加部门名称、办事处名称或项目名。
- 如果包名包含非法元素,可在前面或后面添加下划线使其合法,或将非法字符替换为下划线。
2.2.3 包名举例
假设你受雇于JVM University,要为它开发一个在线Web编程类,而这个类可通过http://www.example.com/jvm-university来访问。
在这种情况下,合法的包名如下:
com.example.jvm_university.class_.web_programmingcom.example.jvm_university.webprogrammingcom.example.jvm.university.web_programming
2.2.4 全限定类名
在有些情况下,必须使用全限定包名,即以完整的包名打头的类名。来看一个示例:
package com.example.jvm.university.web_programming;class Application {}
对于这个类,全限定类名为com.example.jvm.university.web_programming.Application。
