一:
(I)包机制(1)包机制(Package)是Java中为了解决类的命名问题,实现类文件的管理而引入的一种管理机制。(2)在Java中允许将一组功能相同的类放在同一个包下, 从而形成逻辑上的类的集合单元。
(II)包的创建(1)语法1:package包名;(2)语法1:package父包名.子包名;(III)创建包的注意事项(1)package语句必须作为Java文件的第一句非注释语句,放在Java文件
二:
在使用包的过程中有很多需要注意的小细节,这里把常见的问题都列举如下:
1、对类路径的设置通常有两种方法:
i)在系统的环境变量中设置,设置方法依据平台而变;
ii)以命令参数的形式来设置。
如:javac -classpath d:\jdk1.4.2\lib d:\cjm\edu\test\TestFile.java
java -classpath .;d:\jdk1.4.2\lib; d:\cjm
edu.test.TestFile
注意:i)javac和java命令有很大区别,可以这样区分,javac是一个平台命令,它对具体的平台文件进行操作,要指明被编译的文件路径。而java是一个虚拟机命令,它对类操作,即对类的描述要用点分的描述形式,并且不能加扩展名,还要注意类名的大小写。
ii)有一个很奇怪的问题,即javac命令后面的classpath默认包含当前目录(符合windows的习惯),可是在java命令后面的classpath却不包含当前目录,所以在它的classpath中一定不能忘了加上当前目录的描述,即加上"."。
2、在java程序中对类路径的描述用"."分隔,而且也有当前目录的概念。如要运行图1中的TestFile必须指明为 edu.test.TestFile。但是如果在类TestFile中要调用和它在同一目录中的TestString,则不必指明目录前缀。
3、在java程序中所有使用到的类都应该清楚的指明这个类的查找路径。一般有两种方法指明:
i)在程序的开始使用import关键字指明。如类TestFile中要用到FileInputStream类,则在程序头中加入import java.io.FileReader; 或import java.io.*;
ii)在程序中用到FileFileReader类处直接写完整路径,如: java.io.FileFileReader fin = new java.io.FileReader("filename");
注意:java.lang包总是被默认导入的。
4、类的目录结构一定要和类中第一句"包声明"一致。如类TestFile.class对应的.java文件的第一句必须包含:package edu.test;
确保类的存放路径和类中指明的"包路径"一致的方法一般有两种:
i)编写.java文件时存放的目录事先确定好,如TestFile.java就直接放在edu\test目录下,然后用下面的语句编译:
javac -classpath d:\jdk1.4.2\lib d:\cjm\edu\test\TestFile.java
当编译完成后,产生的TestFile.class文件会出现在编译命令中java文件的描述路径中。即出现在d:\test\edu\test中
ii)通过-d参数的使用来编译程序。如使用下面的语句来编译:
javac -d d:\cjm d:\temp\TestFile.java
将在-d后指定的目录d:\cjm下面自动按照packagek中指定的目录结构来创建目录,并且将产生的.class文件放在这个新建的目录下,即在 d:\cjm下面建立\edu\test目录,然后产生的TestFile.class放在d:\cjm\edu\test目录下。
5、为了便于工程发布,可以将自己的类树打成.jar文件。如将图1中的edu下面的所有类文件打成一个.jar文件,可以先转到d:\cjm目录,再用下面的命令:
jar -cvf test.jar edu\
这时会在d:\test下产生一个test.jar文件,此.jar文件中包含edu\下的完整目录结构和文件。使用这个.jar文件时,只需在classpath中指明.jar文件的存放路径即可。
6、对其它资源的使用,如图标文件,文本等资源文件的使用必须要注意,查找资源文件不应从类文件所在的目录开始,而是应该从package指定的类路径 的起点开始(图1中从edu所在目录开始)。如图1中看到的文本文件word.txt在resource下面,而类文件TestFile.class在 edu\test下,在TestFile.class中要使用到resource中的word.txt,要按如下操作:
fin= new FileReader("resource/word.txt");
而不应该是:fin= new
FileReader("../../resource/word.txt");
四、举例
本例用于统计一个文本文件中的单词数,注释中的编号对应前一节的编号:
// TestFile.java
package edu.test; // --------------------------------------- 4
import java.io.FileReader; // ------------------------------ 3
import java.io.LineNumberReader;
class TestFile{
public static void main(String []argv){
TestString ts = new TestString(); //
---------------- 2
FileReader fin;
LineNumberReader line = null;
int wordNum = 0;
try{
fin= new
FileReader("resource/word.txt"); // ---- 6
line = new
LineNumberReader(fin);
}catch(Exception e){
e.printStackTrace();
System.exit(0);
}
while(true){
try{
String temp = line.readLine();
wordNum += ts.CountWord(temp);
}catch(Exception e){
break;
}
}
try{
line.close();
}catch(Exception e){};
System.out.println("Word count
is:" + wordNum);
}
}
// TestString.java
package edu.test;
import java.util.*;
class TestString {
int CountWord(String str){
StringTokenizer token = new
StringTokenizer(str);
return token.countTokens();
}
}
两个.java文件存放在d:\temp目录下,当前目录为d:\temp使用下面的命令进行编译:
d:\temp>javac -classpath d:\jdk1.4.2\lib -d d:\test *.java
用下面的命令运行:
// --------------------------------- 1
d:\temp> java -classpath .;d:\jdk1.4.2\lib;
d:\test\com edu.test.TestFile
如果需要打包的话,先转到d:\test,然后用下面命令:
// --------------------------------- 5
jar -cvf test.jar edu\
这时可产生一个test.jar文件,可将此文件置于任何平台下使用。