首页 > 编程笔记 > Java笔记 阅读:13

Java package包的创建和导入(新手必看)

在 Java 中每定义好一个类,并通过 Java 编译器进行编译之后,都会生成一个扩展名为 .class 的文件。当程序的规模被逐渐扩大时,就很容易发生类名称冲突的现象。

JDK API 中提供了成千上万具有各种功能的类,系统又是如何管理的呢?Java 中提供了一种管理类文件的机制,就是类包。

Java 中每个接口或类都来自不同的类包,无论是 Java API 中的类与接口还是自定义的类与接口,都需要隶属于某一个类包,这个类包包含了一些类和接口。如果没有包的存在,管理程序中的类名称将是一件非常麻烦的事情。

如果程序只由一个类组成,自然不会出现类名重叠的问题,但是随着程序的类的数量增多,难免会出现这一问题。例如,在程序中定义一个 Login 类,因业务需要,还要定义一个名称为 Login 的类,但是这两个类所实现的功能完全不同,于是问题就产生了—编译器不会允许存在同名的类文件。解决这类问题的办法是将这两个类放置在不同的类包中。

编写 Java 程序经常使用 String 类,其实 String 类并不是它的完整名称,就如同一个人需要有名有姓一样,String 类的完整名称如下图所示。


图 1 定义完整的类名

可以看出,一个完整的类名需要包名与类名的组合,每个类都隶属于一个类包,只要保证同一类包中的类不同名,就可以有效地避免同名类冲突的情况。

例如,一个程序中同时使用 java.util.Date 类与 java.sql.Date 类,如果在程序中不指定完整的类路径,那么编译器不会知道这段代码使用的是 java.util 类包中的 Date 类还是 java.sql 类包中的 Date 类,因此需要在指定代码中给出完整的类路径。

例如,在程序中使用两个不同 Date 类的完整类路径,可以使用如下代码:
java.util.Date date = new java.util.Date();
java.sql.Date date2 = new java.sql.Date(1000);
在 Java 中采用类包机制非常重要,类包不仅可以解决类名冲突的问题,还可以在开发庞大的应用程序时,帮助开发人员管理庞大的应用程序组件,方便软件复用。下面来看在 Java 中如何创建类包(以下简称包)。

同一包中的类相互访问时,可以不指定包名。

Java包的创建

在 Eclipse 中创建包的步骤如下:
1) 在项目的 src 节点上右击,在弹出的快捷菜单中选择 New→Package 命令。

2) 弹出 New Java Package 对话框,在 Name 文本框中输入新建的包名,如 com.mr,然后单击 Finish 按钮,如下图所示。


图 2 “新建Java包”对话框

3) 在 Eclipse 中创建类时,可以在新建立的包上右击,然后在弹出的快捷菜单中选择 New 命令,这样新建的类会默认保存在该包中。

在 Java 中包名设计应与文件系统结构相对应,如一个包名为 com.mr,那么该包中的类位于 com 文件夹下的 mr 子文件夹中。没有定义包的类会被归纳在默认包(default package)中。在实际开发中,应该为所有类设置包名,这是良好的编程习惯。

在类中定义包名的语法如下:
package 包名1[.包名2[.包名3...]];
包名 1 ~ 包名 3 都是组成包名的一部分,并且用“.”连接。包名应该是合法的标识符,并且遵守 Java 包的命名规范,即所有字母都是小写的。

在类中指定包名时,需要将 package 表达式放置在程序的第一行,它必须是文件中的第一行非注释代码。使用 package 关键字为类指定包名之后,包名将会成为类名中的一部分,预示着这个类必须指定全名。

例如,在使用位于 com.mr 包下的 Dog.java 类时,需要使用形如 com.mr.Dog 这样的表达式。

前面谈到类名的冲突问题,也许有的读者会产生疑问,如此之多的包不会产生包名冲突现象吗?这是有可能的。为了避免这样的问题,在 Java 中定义包名时通常使用创建者的 Internet 域名的反序,由于 Internet 域名是独一无二的,包名自然不会发生冲突。下面来看一个实例。

【实例】在项目中创建 Math 类,在创建类的对话框中指定包名为 com.mr,并在主方法中输出说明该类并非 java.lang 包的 Math 类。
package com.mr; // 指定包名

public class Math {
    public static void main(String[] args) {
        System.out.println("不是 java.lang.Math 类,而是 com.mr.Math 类");
    }
}
运行结果如下:

不是java.lang.Math类,而是com.mr.Math类

本实例中,在程序的第一行指定包名,同时在 com.mr 包中定义 Math 类。Java 类包中提供了 java.lang.Math 类,而本实例定义的是 com.mr.Math 类,可以看出在不同包中定义相同类名也是没有问题的,因此在 Java 中使用包可以有效地管理各种功能的类。

Java import关键字导入包

如果某个类中需要使用 Math 类,那么如何告知编译器当前应该使用哪一个包中的 Math 类,是 java.lang.Math 类还是 com.mr.Math 类?这是一个令人困扰的问题。此时,可以使用 Java 中的 import 关键字指定。

例如,如果在程序中使用 import 关键字导入 com.mr.Math 类,在程序中使用 Math 类时就会自动选择 com.mr.Math 类。

import 关键字的语法如下:
import com.mr.*;       // 导入 com.mr 包中的所有类
import com.mr.Math    // 导入 com.mr 包中的 Math 类
在使用 import 关键字时,可以指定类的完整描述,如果为了使用包中更多的类,则可以在使用 import 关键字指定时在包指定后加上 *,这表示可以在程序中使用该包中的所有类。

注意,如果类定义中已经导入 com.mr.Math 类,在类体中再使用其他包中的 Math 类时就必须指定完整的带有包格式的类名。例如,在上述情况下再使用 java.lang 包的 Math 类时就要使用全名格式 java.lang.Math。

当在程序中添加 import 关键字时,它会开始在 CLASSPATH 指定的目录中进行查找,查找子目录 com.mr,然后从这个目录下编译完成的文件中查找符合的名称,最后寻找到 Math.class 文件。另外,当使用 import 指定了一个包中的所有类时,并不会指定这个包的子包中的类,如果使用这个包的子包中的类,则需要再次对子包进行单独引用。

相关文章