这两个文件都置于我自己系统的一个子目录中:
+ C6 |+ `2 N' O1 t C:DOCJavaTcombruceeckelutil
% v& h# I! l$ S. a8 J 若经由过程它往回走,就会发现包名com.bruceeckel.util,但路径的第一部门又是什么呢?这是由CLASSPATH情形变量抉择的。在我的机械上,它是:
/ @, A1 Y7 M9 c/ ?* y0 M( U$ E CLASSPATH=.;D:JAVALIB;C:DOCJavaT% D. S2 ?, ]! u! J" ]
可以看出,CLASSPATH里能包含年夜量备用的搜索路径。然而,使用JAR文件时要注重矣闽问题:必需将JAR文件的名字置于类路径里,而不仅仅是它地址的路径。所以对一个名为grape.jar的JAR文件来说,我们的类路径需要搜罗:
: l7 M' l* E B+ I5 o CLASSPATH=.;D:JAVALIB;C:flavorsgrape.jar
9 s3 w, L4 ^/ p+ g' \ f& \* f& Y 正确设置好类路径后,可将下面这个文件置于任何目录里(若在执行该轨范时碰着麻烦,请参见第3章的3.1.2小节“赋值”):
6 P. T7 a4 r8 m0 `& b7 y6 R //: LibTest.java; \. B* U$ B* I6 [
// Uses the library
% ^# h# b% _/ N$ v& c! G package c05;& F3 A6 O7 D, ^0 ?7 a
import com.bruceeckel.util.*;
1 \& ^+ A/ }* S. \ public class LibTest {
) Z4 r% B, K% G, e( j; M0 B A public static void main(String[] args) {1 O5 e& p1 f& U# [/ y
Vector v = new Vector();/ x+ D5 P3 e5 N9 {% q& w, R+ R
List l = new List();
& p9 z" f5 X1 K: P; }4 B. q. Q/ Q }
, F* P% W$ N1 U2 e* @ } ///:~
$ {& ^! V: ?. [& ], n 编译器碰着import语句后,它会搜索由CLASSPATH指定的目录,查找子目录combruceeckelutil,然后查找名称恰当的已编译文件(对于Vector是Vector.class,对于List则是List.class)。注重Vector和List内无论类仍是需要的体例都必需设为public。
( ]# ^; l( S1 v6 K, Q: Y 1. 自动编译9 J2 _' O4 H6 T# U+ U* L
为导入的类初度建树一个对象时(或者访谒一个类的static成员时),编译器会在恰当的目录里寻找同名的.class文件(所以如不美观建树类X的一个对象,就应该是X.class)。若只发现X.class,它就是必需使用的那一个类。然而,如不美观它在不异的目录中还发现了一个X.java,编译器就会斗劲两个文件的日期标识表记标帜。如不美观X.java比X.class新,就会自动编译X.java,生成一个最新的X.class。: R6 v% o, B' c7 e
对于一个特定的类,或在与它同名的.java文件中没有找到它,就会对阿谁类采纳上述的措置。
4 V! h- @6 J. c# j8 R }/ g8 N9 ? 2. 冲突4 j' P( V4 n6 I
若经由过程*导入了两个库,而且它们搜罗不异的名字,这时会呈现什么情形呢?例如,假定一个轨范使用了下述导入语句:4 @& C* V$ j) }6 T, X
import com.bruceeckel.util.*;
- m2 B5 h# a" a' K6 a' n, s import java.util.*;
! y+ k% t2 H# t/ p7 I 因为java.util.*也包含了一个Vector类,所以这会造成潜在的冲突。然而,只冲要突并不真的发生,那么就不会发生任何问题——这当然是最理想的情形,因为否则的话,就需要进行年夜量编程工作,提防那些可能可能永远也不会发生的冲突。) u/ I# Z0 I7 x' [
如斯刻试着生成一个Vector,就必定会发生冲突。如下所示:
% K, `4 M: i7 q% F) g Vector v = new Vector();" t; y! ~ J1 F
它引用的到底是哪个Vector类呢?编译器对这个问题没有谜底,读者也不成能知道。所以编译器会陈述一个错误,强迫我们进行明晰的声名。例如,假设我想使用尺度的Java Vector,那么必需象下面这样编程:/ s8 j+ s+ o9 T: g- k
java.util.Vector v = new java.util.Vector();- o. ?& F2 _6 N* z2 C, Y6 |1 D
因为它(与CLASSPATH一路)完整指定了阿谁Vector的位置,所以不再需要import java.util.*语句,除非还想使用来自java.util的其他工具。 |