`
rimoer
  • 浏览: 103401 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

完全掌握java中的"包"机制

 
阅读更多


"机制是java中特有的,也是java中最基础的知识。一些初学java的朋友,通常象学其它语言一样从教材上copy一些程序来运行,可是却常常遇到莫名其妙的错误提示。这些问题事实上都出在对"包"的原理不够清楚。本文将就此问题进行深入阐述。

一、为什么java中要有"包"的概念?

以一言概之,java中"包"的引入的主要原因是java本身跨平台特性的需求。因为java中的所有的资源也是以文件方式组织,这其中主要包含大量的类文件需要组织管理。java中同样采用了目录树形结构。虽然各种常见操作系统平台对文件的管理都是以目录树的形式的组织,但是它们对目录的分隔表达方式不同,为了区别于各种平台,java中采用了"."来分隔目录。

二、java中包结构和平台的衔接

java中的资源存在于不同平台下时必然会有很大差异。因此跨平台的java包结构和平台之间必须通过一种方式来衔接到一起。事实上它们就是通过我们很熟悉的classpath的设置来衔接到一起的。举个例子:

我在Windows2000环境下的classpath设置如下:

classpath = d:/jdk1.4.2/lib/dt.jar; d:/cjm

类的衔接关系可以用下图来表达:

从图中可以看出,java中的类的组织是"悬空"的,这样的话,它们可以随意放在任意平台下,但是要在该平台下正确找到一个类,则必须使用classpath来设置类所在目录的前面一部分(即区别于平台的部分)。在java中常常把一棵类树压缩成一个.jar文件,如图中的rt.jar,这并不影响对类的查找,在指定环境变量时可以指定.jar文件所在目录,也可以具体指明.jar的完全查找路径,即上例中的classpath中也可描述成:

classpath = d:/jdk1.4.2/lib; d:/cjm

当正确设置了平台下的classpath环境变量时,java跨平台的特性就体现出来了。即你在编写程序中,描述一个类时,就不用具体指明它的完整路径,而是仅仅指明java中的类路径就可以了,即指出图1中竖线右边的查找路径就可以了。这样的话,你编写的程序拿到任何平台下时,只需要根据类文件的存放目录来书写相应的classpath环境变量,而不用因为类的存放环境变化而修改程序。

注意:java中对于某个类的查找是把classpath中的每一项逐一连接,当一个连接能够正确找到相关类后,便不再向后查找。

三、正确使用"包"

在使用包的过程中有很多需要注意的小细节,这里把常见的问题都列举如下:

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文件,可将此文件置于任何平台下使用


"包"机制是java中特有的,也是java中最基础的知识。一些初学java的朋友,通常象学其它语言一样从教材上copy一些程序来运行,可是却常常遇到莫名其妙的错误提示。这些问题事实上都出在对"包"的原理不够清楚。本文将就此问题进行深入阐述。
一、为什么java中要有"包"的概念?
以一...

分享到:
评论

相关推荐

    完全掌握java中的包机制

    ### 完全掌握Java中的包机制 #### 一、引言 在Java编程语言中,“包”是一个重要的概念,它是组织类和接口的基本单位。合理地使用包不仅可以帮助开发者更好地组织代码,还能有效地避免命名冲突,提高代码的可读性...

    关于java的类机制

    ### Java中的类机制 #### 一、类的基本概念 在面向对象编程语言Java中,类是对象的模板或蓝图,用于定义对象的属性(数据成员)和行为(方法)。类是一种用户自定义的数据类型,它允许我们创建具有相同特性和行为...

    JAVA包的引入问题

    ### JAVA包的引入问题详解 #### 一、背景介绍 在Java编程中,包(package)是一种组织类和接口的方式,可以有效地避免命名冲突,并且能够提高代码的可维护性。本文将详细介绍Java中的包是如何引入的,以及在实际操作...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    java-Swing外观包

    在这个"java-Swing外观包"中,我们重点关注的是Swing的外观(LookAndFeel)部分。 Swing外观包,即LookAndFeel,是Java Swing提供的一种机制,允许开发者改变应用的视觉样式,以匹配不同的操作系统或个人偏好。Java...

    Java完全自学手册

    本《Java完全自学手册》将全面覆盖Java的基础到高级概念,帮助读者从零开始掌握Java编程。以下是可能涵盖的主要知识点: 1. **Java基础**:包括Java环境搭建,如JDK的安装和配置;理解Java语法基础,如数据类型...

    Java语言提供的一种接口(interface)机制

    Java 语言中的接口(Interface)是面向对象编程的重要组成部分,它提供了一种抽象层次更高、更为灵活的机制,使得类可以实现多个行为或特质。接口是完全抽象的,不包含任何方法的实现,只包含方法签名(方法名、返回...

    java开发手册 api文档(jdk1.8中文)

    《Java开发手册API文档(JDK1.8中文版)》是Java开发者的重要参考资料,它详细阐述了JDK1.8版本...通过深入理解和实践其中的内容,开发者能够更好地掌握Java后端开发,并利用其高效、稳定的特性构建高质量的应用系统。

    java中实现多态的机制Java系列2021.pdf

    尽管Java不支持完全意义上的参数多态,但是其泛型机制提供了一种实用的解决方案。 最后,文档中指出包含多态与子类和父类之间的关系紧密相关。在Java中,我们可以向上转型将子类对象引用作为父类引用,但只能调用...

    《Java完全自学宝典》 光盘代码

    压缩包中的“Java完全自学宝典 光盘”可能包含了与上述知识点对应的示例代码,每个章节的代码都精心设计,以便读者动手实践,通过实际操作来巩固理论知识。读者可以通过运行这些代码,观察结果,分析错误,从而深化...

    几十个java游戏源代码打包,仅供学习使用。

    通过分析和理解这些源代码,你可以逐步掌握Java游戏开发的基本技巧,并且随着经验的增长,可以尝试将学到的知识应用到更复杂的游戏项目中去。同时,不要忘记实践是提升编程技能的最佳途径,尝试修改代码,加入新的...

    java web 整合开发 完全自学手册 光盘资料 源代码partII

    总的来说,通过阅读《Java Web整合开发完全自学手册》并实践光盘中的源代码,你将能够掌握Java Web开发的全面技能,包括后端处理、前端展示、数据持久化等多个方面。无论是初学者还是有一定经验的开发者,都能从中...

    Thinking_in_java中文第4版(Word完全版)

    本书旨在帮助读者全面掌握Java编程思想,从基础到高级特性,涵盖了广泛的知识点。 1. **对象和面向对象编程**:书中强调了对象作为编程的基本单元,介绍了对象的接口、隐藏实现、复用和继承等概念。面向对象的特性...

    java实用教程课件,掌握Java入门基础

    本教程主要针对Java入门学习,旨在帮助初学者掌握Java的基础知识,包括类、对象、接口等重要概念。 4.1 编程语言的发展阶段: 编程语言经历了从机器语言到高级语言的演变,从最初的二进制指令集(如汇编语言)到...

    hadoop的JAVA编程包

    通过理解和掌握上述知识点,开发者可以有效地使用Java进行Hadoop应用开发,实现大数据的高效处理和分析。这个提供的"Hadoop的JAVA编程包"可能包含了Hadoop相关的库和示例代码,对于初学者或开发者来说,是一个很好的...

    java中文手册全部中文解释

    Java中文手册是一部全面而详尽的参考资料,旨在帮助开发者理解和掌握Java编程语言。这份手册以中文呈现,使得中文用户能够更方便地学习和查询Java的相关知识。以下将根据标题、描述以及提供的压缩文件名,详细阐述...

Global site tag (gtag.js) - Google Analytics