包是由.class文件组成的一个集合,.class文件时可以用Java解释其解释执行的文件,它也是由Java源的文件,即.Java文件经编译而生成的。Java是一种面向对象的语言,它的特点就是重用,包就是组织和管理.class文件的一种工具,因此,它存在的目的就是帮助我们实现代码的重用。包是一种松散的概念,一般情况下,功能相同或者相关的类组织在一个包中,例如java.io包中的类都与输入、输出有关,java.applet包中的类都与applet程序有关。

构建包

一个包事实上就是一个文件夹,这个文件夹中存放着.class文件。包像目录结构一样可以由多层结构,而各层之间以“.”来分隔,如java.io,java.awt,java.awt.color等。由于Java的类经常需要在互联网上运行,所以有可能出现同名的类,程序就不知道使用哪一个类了。但如果把类都放在不同的包中,并且使包的名字独一无二,就不会出现混乱状况。

程序中定义包用package这个关键词,它的格式如下:

package 包名:

例如:

package MyJavaProgram;
package cn.com.companyname.myname

这个语句必须放在一个源文件的第一句,并且语句前面无空格。包名一般全部用小写。我们知道一个源文件可能有多个类,其中只有一个类是公共类,这些类经编译都会产生.class文件,上面的意思是,这个源文件中的类,经编译产生的.class文件属于一个包,名为MyJavaProgram。这就定义了MyJavaProgram包。一般把要打包的源文件放到包中,然后再包中对源文件进行编译,就把.class文件放入包中了。当然javac编译器还有几个参数,可以实现确定源文件来源和.class文件放置等功能,可以实现源文件和.class文件不在同一个目录。下面是各种参数及其解释。

-g 生成所有debug信息

-g:none 不生成任何debug信息

-g:{lines,vars,source} 只生成部分debug信息

-O 优化

-nowarn 不生成警告

-verbose 输出编译器的工作记录

-deprecation 输出所有过期API的位置

-classpath 声明查找用户类库的路径

-sourcepath 声明查找源文件的路径

-bootclasspath 覆盖引导类文件路径

-extdirs 覆盖安装扩展路径

-d 声明将生成的.class文件放在何处

-enconding 声明源文件的编码方式

-traget 未指定版本的虚拟机生成类文件

包的引用

用import语句就可以引入所需的公共类,如:

import java.io.*;

这个语句表示java.io中所有的公共类被引入当前包。系统先根据classpath只是的路径,然后按照包名找到所需的类,如classpath为c:\package\mypakage,而包名为cn.com.companyname.myname,系统则按照以下路径去寻找所需的类:c:\package\mypackage\cn\com\companyname\myname,也就是把环境变量和包名相连,形成路径,然后在这个路径下寻找类。对于Java类库,由于安装时已经自动注册了路径,所以不需要添加classpath,而使用自己定义的包中的类就必须更改classpath。

还有一种方法使用某个包中的类,就是在程序中写全它的包名,但很麻烦,而不使用import语句,如:

java.io.FileInputStream in = new java.io.FileInputStream();

如果我们使用了一个包中的大多数类,可是使用通配符的方式引用包,否则,最好把需要类一一列出来,这样可以节省大量系统资源

下面一些参考信息:

1.使用配置好的$CLASSPATH,在编译的时候,如果当前的$CLASSPATH包含了所需要的所有类库,则不需要包含其它的值。只需使用java

***.java,则当前目录下会生成一个***.class,如果在***.java中使用了packagea.b.c;但是简单的javac只能在当前目录生成***.class文件,此时,如果想运行的话,需要在当前目录创建a/b/c/***.class的结构,然后执行java

a.b.c.abc

如果此时你使用cd a,进入a目录,则我们需要使用java

-cp../

a.b.c.abc,这样才会找到class文件。

2.Java编译需要使用到其它的jar的时候,则需要指定全部jar路径,不能使用文件夹包含所有形式,使用文件夹class或者普通文件的形式,javac

-cp $CLASSPATH:xxx/xxx/xxx.jar:xxx/xxx/xxx.jar

xxx.java

3. 在运行的时候,使用java -cp classpath

的使用方法和javac基本相同,但是需要注意的时候,当我们需要将非$CLASSPATH环境变量包含的值的时候,需要指出当前class所在的位置,这个位置是要考虑package之后的文件夹的位置,例如上面的a/b/c/abc.class,一定要将目录指定到a所在的目录层次。