这两个文件都置于我自己系统的一个子目录中:
1 c; G3 M3 s% h) ^ C:DOCJavaTcombruceeckelutil
; c8 r% m, O$ m+ z3 w1 \1 [2 @2 w 若经由过程它往回走,就会发现包名com.bruceeckel.util,但路径的第一部门又是什么呢?这是由CLASSPATH情形变量抉择的。在我的机械上,它是:( |3 I% N( T* G2 G; ?
CLASSPATH=.;D:JAVALIB;C:DOCJavaT
% z# p! [" D6 \ 可以看出,CLASSPATH里能包含年夜量备用的搜索路径。然而,使用JAR文件时要注重矣闽问题:必需将JAR文件的名字置于类路径里,而不仅仅是它地址的路径。所以对一个名为grape.jar的JAR文件来说,我们的类路径需要搜罗:
' {- D- V, G$ E% A% U! m CLASSPATH=.;D:JAVALIB;C:flavorsgrape.jar8 e1 z/ N5 M1 n# m
正确设置好类路径后,可将下面这个文件置于任何目录里(若在执行该轨范时碰着麻烦,请参见第3章的3.1.2小节“赋值”):" s! d4 E& N0 f0 |0 r( v) S# X1 y
//: LibTest.java
) V- F5 F( g' N1 b" G# H/ Z // Uses the library
" e3 v) S/ U! x o8 @5 \: f% l' k- x package c05;
/ k( o1 b' u! T import com.bruceeckel.util.*;1 M$ L) Z o; r' P7 F
public class LibTest {
; j+ B5 v/ @0 p+ \1 ^ public static void main(String[] args) {# n4 S7 w3 M! n+ q7 x. [; H
Vector v = new Vector();# Q# ~. _% I2 Z& n
List l = new List();! Q, l" ?% b2 i+ V/ i# }( D
}* W1 |5 ~; w8 x% \# E3 h5 P
} ///:~0 X' F+ u0 x$ c
编译器碰着import语句后,它会搜索由CLASSPATH指定的目录,查找子目录combruceeckelutil,然后查找名称恰当的已编译文件(对于Vector是Vector.class,对于List则是List.class)。注重Vector和List内无论类仍是需要的体例都必需设为public。$ K% `5 g3 E3 J: Z& y7 {
1. 自动编译6 c! \8 j$ Z$ I) i+ \' \) U, a# w
为导入的类初度建树一个对象时(或者访谒一个类的static成员时),编译器会在恰当的目录里寻找同名的.class文件(所以如不美观建树类X的一个对象,就应该是X.class)。若只发现X.class,它就是必需使用的那一个类。然而,如不美观它在不异的目录中还发现了一个X.java,编译器就会斗劲两个文件的日期标识表记标帜。如不美观X.java比X.class新,就会自动编译X.java,生成一个最新的X.class。: A4 C+ O$ [( ]
对于一个特定的类,或在与它同名的.java文件中没有找到它,就会对阿谁类采纳上述的措置。
# \- c! J6 W7 k3 M! j 2. 冲突
/ F* ?0 X; e% q# Q 若经由过程*导入了两个库,而且它们搜罗不异的名字,这时会呈现什么情形呢?例如,假定一个轨范使用了下述导入语句:2 d( ]7 Y$ v8 q9 l2 f9 t7 @! B
import com.bruceeckel.util.*;( _, ]7 @3 {3 ^3 n! d& o0 x5 R8 `
import java.util.*;
$ r" \7 c/ y, j4 L; N 因为java.util.*也包含了一个Vector类,所以这会造成潜在的冲突。然而,只冲要突并不真的发生,那么就不会发生任何问题——这当然是最理想的情形,因为否则的话,就需要进行年夜量编程工作,提防那些可能可能永远也不会发生的冲突。
. W, Y1 E) [& P5 d8 \ 如斯刻试着生成一个Vector,就必定会发生冲突。如下所示:7 H& x& P m0 M. F) x% r
Vector v = new Vector();: `, Y7 s0 q1 [! d
它引用的到底是哪个Vector类呢?编译器对这个问题没有谜底,读者也不成能知道。所以编译器会陈述一个错误,强迫我们进行明晰的声名。例如,假设我想使用尺度的Java Vector,那么必需象下面这样编程:
" B4 y- e, s1 Y( L java.util.Vector v = new java.util.Vector();
2 A& Y6 t# o, J j4 M+ { 因为它(与CLASSPATH一路)完整指定了阿谁Vector的位置,所以不再需要import java.util.*语句,除非还想使用来自java.util的其他工具。 |