为了更好的区分管理类,Java 引入了包(package))的概念。Java 采用类似于文件夹的形式引入包的概念存储类,并且可以借助包名对类进行区分, 即使类名相同,但是包名不同,Java 也可以区分到底到底引用的是哪个类。
Java 使用package关键字来命定定义包,通常使用小写的字母来命名避免与类、接口名字的冲突:
package pkg1[.pkg2[.pkg3…]];通常我们使用公司、企业或者组织的域名地址加上项目名称,再加上对应的功能名称来命名包。例如Java 中常用的util包就是这样命名的。
/**
* java 是Sun公司推出的编程语言 这里并没有使用域名地址
* 只使用了项目名称和对应的功能名称
*/
package java.util;-
把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
-
通过包名给类添加了唯一标识,避免了类名相同到时使用冲突。
-
包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
-
包声明应该在源文件的第一行,每个源文件只能有一个包声明,这个文件中的每个类型都应用于它。
-
如果一个源文件中没有使用包声明,那么其中的类,函数,枚举,注释等将被放在一个无名的包(unnamed package)中。
为了使用包内的类、接口、枚举、注释,可以通过import关键字进行相应的导入。
在Java 源文件中import语句应位于package语句之后,所有类的定义之前,可以没有,也可以有多条,其语法格式为:
package pkg1[.pkg2[.pkg3…]];
import package1[.package2…].(classname|*);
public class Demo {
}!>注意: 如果在一个包中,一个类想要使用本包中的另一个类,那么该包名可以省略。
当使用不在同一个包之中的类的时候,必须使用import语句,使用方法有以下两种:
- 直接引用相应的使用类, 如:
import java.util.Date;- 可以使用统配符
*来引入整个包,这样也可以使用包中的类,如:
import java.util.*;类目录的绝对路径叫做class path。设置在系统变量 CLASSPATH 中。编译器和Java 虚拟机通过将package名字加到class path后来构造.class文件的路径。
类中有包声名时的编译执行过程:
-
编译如果Java 文件中没有包声名则Java 虚拟机会在Java 文件所在目录下生成
.class字节码文件;如果有包声名,则在对应的包路径下生成.class字节码文件。 -
打包编译时,会自动创建包目录,不需要自己新建包名文件夹。
-
当当前目录有多个Java 文件需要编译或打包编译时,
javac -d . *.java指令可以给当前目录下的所有Java 文件根据程序中是否有包声明进行编译或打包编译。 -
当执行时如果没有包声名,Java 虚拟机会直接在当前目录下寻找编译后的
.class字节码文件,找到直接执行;如果有包声名,会现在当前目录下寻找,紧接着去包目录下寻找有没有.class字节码文件,有才会执行。