网站首页 > java教程 正文
原文
4.8.6
在前面已经看到,类存储在文件系统的子目录中。类的路径必须与包名匹配。
另外,类文件也可以存储在jar (Java归档)文件中。在一个jar 文件中,可以包含多个压缩格式的类文件和子目录,这样既可以节省空间又可以改善性能。在程序中用到第三方的库时,你通常会得到一个或多个需要包含的jar 文件。第11章将介绍如何创建你自己的 jar 文件。
提示:jar 文件使用zip 格式组织文件和子目录。可以使用任何zip工具查看jar 文件
为了使类能够被多个程序共享,需要做到以下几点:
- 把类文件放到一个目录中,例如 /home/user/classdir。需要注意,这个目录是包树状结构的基目录。如果希望增加 com.horstmann.corejava.Employee类,那么Employee.class 类文件就必须位于子目录 /home/user/classdir/com/horstmann.corejava 中。
- 将jar 文件放在一个目录中,例如 /home/user/archives。
- 设置类路径(class path)。类路径是所有包含类文件的路径的集合
- 在UNIX环境中,类路径的各项之间用冒号(英文冒号 : )分隔,如:
/home/user/classdir:.:/home/user/archives/archive.jar
而在windows ,则以分号(英文分号 ; )分隔,如:
c:\classdir;.;c:\archives\archive.jar
不论在unix 还是在 windows ,都用句号(英文 .)表示当前目录
类路径包括:
- 基目录 /home/user/classdir 或 c:\classdir ;
- 当前目录(.)
- jar 文件 /home/user/archives/archive.jar 或 c:\archives\archive.jar
从Java 6 开始,可以为jar 文件目录指定一个通配符,如下
/home/user/classdir:.:/home/user/archives/'*'
或
c:\classdir;.;c:\archives\*
在 unix 中,* 必须转义以防止 shell 扩展。
archives 目录中的所有jar 文件(但不包括.class 文件)都包含在这个类路径中。
由于总是会搜索Java api 的类,所以不必显示地包含在类路径中。
警告:javac 编译器总是在当前目录中查找文件,但只有当类路径中包含“.” 目录时,Java虚拟机才会查看当前目录。如果你没有设置类路径,那么没有什么问题,因为默认的类路径会包含 "."目录。但是如果你设置了类路径却忘记包含 “.” 目录,那么尽管你的程序可以没有错误地通过编译,却不能运行。
类路径所列出的目录和归档文件是搜索类的起始点。下面看一个类路径示例:
/home/user/classdir:.:/home/user/archives/archive.jar
假定虚拟机要搜索 com.horstmann.corejava.Employee 类的类文件。它首先要查看Java api 类。现在,在那里找不到相应的类文件,所以转而查看类路径。它会查找以下文件:
- /home/user/classdir/com/horstmann/corejava/Employee.class
- com/horstmann/corejava/Employee.class (从当前目录开始)
- com/horstmann/corejava/Employee.class(/home/user/archives/archive.jar中)
编译器查找文件要比虚拟机复杂得多。如果引用了一个类,而没有指定这个类的包,那么编译器将首先查找包含这个类的包。它会查看所有的import 指令,确定其中是否包含这个类。例如,假定源文件包含指令:
import java.util.*;
import com.horstmann.corejava.*;
并且源代码引用了Employee 类。编译器将尝试查找 java.lang.Employee(因为总是会默认导入java.lang包)、java.util.Employee、com.horstmann.corejava.Employee 和当前包中的Employee。它会在类路径所有位置中搜索以上各个类。如果找到了一个以上的类,就会产生编译时错误(因为完全限定类名必须是唯一的,所以import 语句的次序并不重要)。
编译器的任务不止这些,他还要查看源文件是否比类文件新。如果是这样的话,那么源文件就会自动地重新编译。在前面已经知道,只可以导入其他包中的公共类。一个源文件只能包含一个公共类,并且文件名与公共类名必须匹配。因此,编译器很容易找到公共类的源文件。不过,还可以从当前包中导入非公共类。这些类有可能在与类名不同的源文件中定义。如果从当前包中导入一个类,那么编译器就要搜索当前包中的所有源文件,查看哪个源文件定义了这个类。
猜你喜欢
- 2024-09-10 新手的第二辆自行车——JAVA 鱼雷6TOP#公路自行车
- 2024-09-10 EffectiveJava-6-方法(EffectiveJava-6-方法图片)
- 2024-09-10 巅峰对决!Spring Boot VS .NET 6(巅峰对决之千碎龙王)
- 2024-09-10 Java 6 问世(java17)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)