读书人

《java深度历险》学习札记-package与i

发布时间: 2012-12-25 16:18:28 作者: rapoo

《java深度历险》学习笔记--package与import机制

1、注意,以上明只是了path 境的使用--用于指明java与javac命令的搜索路径。事上,乎大多
版本的JDK 都於安主在<Windows 安目>\system32 底下
一份java.exe,而<Windows 安目>\system32 通常又是Windows
path 境中的其中一路,所以一般的情下,都生可以行
java.exe,不能行javac.exe 的情形。

?

2、在此推您一非常好用的: -verbose 。您可以在javac.exe 或java.exe
中使用此。他可以您更了解和行程中JVM 所做的每件事情。

?

3、,器是先到 A.java 本身所在的路中找
B.java,然器找到了B.java,可是比其package 宣告之後,
它位於edu\nctu 目下,不在此目下,因此生息。

?

4、一:
如果您的於某package,那您就它至於package 所
的相路之下。例,如果您有叫做C,於xyz.pqr.abc 套件,
那您就必建立一三的目 xyz\pqr\abr,然後C.java 或是C.class
放置到目下,才能javac.exe 或是java.exe 利行。
其少了一重,就是新建的目哪始? 一定要
d:\my 底下始建立? 大家保留在心,我在底下的
之中大家明。

?

5、二:
您使用javac.exe 的候,原始的位置一定要根一所
放置,如果原始出在不出的地方(如上述中B.java 同存在
d:\my d:\my\edu\nctu 之下),除了很容易造成混淆不清,而且有候抓
不出何生,因javac.exe 出的息根本法改善。

?

6、三:
,如果程式用到其他的,不需要的原始也一能通

?

7、四:
您使用javac.exe 程式又有的原始,放置的位置
根一所的方式放置。如果出在不出的地方(如上述
中B.class 同存在d:\my d:\my\edu\nctu 之下),有很大的可能性
造成以的。然上述的中,使用java.exe 行Java 程式,
放不造成行,但是是建您量不要做,除了有意
之外,做法像是一不定炸,都有可能造成您的困

?

8、五:
一中我提到,如果您有叫做C,於xyz.pqr.abc 套件,那您
就必建立一三的目 xyz\pqr\abr,然後C.java 或是C.class 放置到
目下,才能javac.exe 或是java.exe 利行。但是新建的目
哪始呢? 答案是:”可以建立在任何地方”。但是您必告java.exe
javac.exe 到哪去找才行,告的方式就是利用它的-classpath 。
在此中,我把edu\nctu 目移到d:\之下,所以我必使用指令:
javac classpath d:\ A.java

java classpath d:\;. A
告java.exe javac.exe :”如果你要找,到-classpath 後
面指定的路去找,如果找不到就算了”。
不又衍生出,首先第一是,那什之前的指令都不需
要外指定-classpath 呢?是因您行java.exe 和javac.exe ,
其他已自您加了,所以不管是一或二所使用的指令,其
行的子如下:
javac classpath . A.java

java classpath . A
意思就是,他都把您所在的目作是-classpath 的。
那您可以,如果是javac.exe 行,我所在的路是d:\my,
所以很自然地,他自到d:\my 底下的edu\nctu 目找需要的案,
java.exe 也是一的道理。
但是,一旦我搬移了 edu\nctu 目之後,的使得
javac.exe 要找d:\my\edu\nctu 底下的B.java 或B.class 行,
生d:\my\edu\nctu 目都找不到的情(因被我移走了),所以自然
生。因此我必使用在指令中加上classpath d:\,javac.exe
到d:\下找相路d:\edu\nctu。行java.exe 之所以也要在指令中加
上classpath d:\,也是一的道理。
如果您仔比修改的指令,您是些的差,於是引了
第二:什javac.exe 用的是classpath d:\,而java.exe 如果不
用classpath d:\;.而只用classpath d:\法行呢? 我在第二章曾提,
-classpath 是用指引AppClassLoader 到何入我所需要的。在
行期,主程式A.class 也是一,所以如果不是的情(指向目
前所在目,即”.”),我一定要向AppClassLoader 交代清楚所有相
的所在位置。但是器,A.java 就是案,只要在目前目
之下,器就能找到,基本上和AppClassLoader 毫,需要在
-classpath 指定路,只是了在期AppClassLoader 可以我入
B.class 或指引器找到B.java,所以必指定。因此,javac.exe
,-classpath 有上述作用;然而於java.exe ,就只有
AppClassLoader 一作用而已。

?

9、注意,境
CLASSPATH classpath 分所指定的路不有加成效果。

?

10、六:
使用ZIP 的效果和的目相同,如果您在classpath 指定了目,就
是告java.exe 和javac.exe 到目找;如果您在classpath
指定了ZIP 的名,那就是java.exe 和javac.exe 到中找
。注意,即使是在中,但是有的相路是要有,否java.exe
和javac.exe 仍然法找到他所需要的。
然,在境 CLASSPATH 中也可以指定ZIP 作其容。

?

11、其JAR
就是ZIP 。何大家喜使用JAR 的封方式呢?是因一般人所
的套件是附多和源(例如形),多案全部放在目
下很容易人感到不堪,如果些案全部封在一所之中,不
但可以少案大小,也可以您的硬碟看起更精。也是何每次我下
了某人所的套件,如果只有一JAR ,我就必在境
CLASSPATH 或classpath 中加上JAR 的名,因唯有如此,我
才能java.exe 和javac.exe找到我的程式中所使用到人套件中的
,成功行。

?

12、之所以要特提醒大家,是因常常在程式的候不小心在
地方都有相同的套件(也是者本身的切身之痛),一比,但指定
classpath 的候路前,致然另外一路有新版的程式,但是
行或是跑出版程式的行果,人丈二金摸不著袋。所以最
後是要提醒您特注意正。

?

13、

1. JAVA 和安置在其所之package 所的相路
下。
2. 不管使用 java.exe 或javac.exe,最好明指定classpath ,如果
怕麻,使用境CLASSPATH 可以省去您入外指令的。
注意在他所指定的路或JAR 中是否存有package 名和
名相同的,因名上的突很容易引起混淆。

?

14、如果没有利用加载器的make机制来编译和运行代码,则要一个个的编译和运行,如:

A.java在d:\my\edu\nctu\mot\目录下

代码为:

package edu.nctu.mot ;public class A{    public static void main(String[] args)   {       System.out.println("I'm A") ;   }}

?

在d:\my目录下

编译用

javac d:\my\edu\nctu\mot\A.java

执行用

java classpath . edu.nctu.mot.A

?

15、,不管你有有使用import 指令,存在目前
目下的都被器先用,只要它不於任何package。是因
器是先假您所入的名就是的全名(不於任何
package),然後-classpath 所指定的路中搜於的.java
或.class

?

16、息明了器生疑惑,因 com edu package 底
下都有名CA 的,他不知道用哪一。解的法就是明地告
器我要哪package 底下的CA,解方法有:
1. 在 import 明宣告,也就是把Main.java 改成
src\comtime\Main.java
import com.CA;
import edu.*;
public class Main
{
??? public static void main(String args[])
?? {
??????? CA ca = new CA() ;
?? }
}
或者
2. 引用指定的全名(即套件名.名的合)
src\comtime\Main.java
import com.*;
import edu.*;
public class Main
{
???? public static void main(String args[])
??? {
???????? com.CA ca = new com.CA() ;
????}
}

?

17、使用javac classpath .. Main.java 编译Main.java 时,默认以窗口所在路径为根路径(一般为Main.java所在的路径),然后编译Main时,会利用make机制先去加载编译Main所需要的其他类,此时要在classpath中把所有要加载的类的路径都列出来才行。

?

18、以上面,是假我用的指令是:
javac classpath d:\test;c:\p.jar test.java
所以使得路考表之中有料,接著,假我的test.java 之中有
import A.B.* ;
import C.D ;
那器就先看看d:\test 目底下使否存在有A\B 目,也就是
器查d:\test\A\B 究竟是否存在,如果找不到,它著再找看看c:\p.jar
之中是否存在A\B 目,如果都找到,就出package A.B does not
exist 的息。同理,器也著找是否存在d:\test\C\D.class 或
d:\test\C\D.java(如果找不到就入c:\p.jar 找),定他所的
package 名,也保他public(如此才能其他package 的
所存取,且名一定名相同),如果找到就出cannot resolve
symbol 的息。

?

19、上面所的 Java 器作,亦一般人常常有的解做了解:
1. import 和C/C++的include 同意。
2. 在 import 使用用字元,如import x.y.* ,器效率低。
其中,第一解也常很多程式得不解,什在Java 之中法使

import java.*.*
有一以上用字元的法?
由上面的你可以知道,在Java ,import 和C/C++的
namespace 等才,而非一般所的include。
假你有,分是 X.A X.B.C,你必分
import X.* ;
import X.B.* ;
才行,因指令器分在路考表之中建立料,如
此一器名路考表的料作合成的候,才能你
的程式:
C c1 = new C();
通,如果你只有
import X.* ;
器回出息,它法解析C。也就是,路考表
的料,只是拿合成,器可以很快地定位到或原始的位
置,不式地我自搜路底下其他的,所以不管在import
使用完整的名或用字元,即使原始使得路考表和相
考表很大很大,但是javac.exe 部在理些料表格也是用Hash
Table 的,所以速度的影乎微乎其微。

?

20、器找到的或原始之後,都加以他使否真的於
package,如果有,器一出息;但是如果非透
make(自解析名,自所需)制程式,是不做
工作的。

?

21、
利用相同的,我回解一下,在本章前半部之中到package
import 制那段落的最後一例,我所使用的案是:
A.java
package edu.nctu.mot ;
public class A
{
public static void main(String[] args)
{
System.out.println("I'm A") ;
}
}
用的指令有以下,我分解其成功失之原因:
1 javac edu.nctu.mot.A.java
路 考 表 中 只 有 一 ”.” , 以此起始, 找不到名
edu.nctu.mot.A.java 的案。也就是,在期,不自把命
令列之中所指定的原始之中的”.”成”/”。我指定什案,
器一律是的名。
2 javac -classpath .\my\edu\nctu\mot A.java
路考表中只有一”.\edu\nctu\mot”,以此起始,其
可以找到名A.java 的案,可是是,A.java 非透make
制,而是我手打指令,所以根本不用到路考
表。因此器根本找不到A.java。
3 javac -classpath d:\my\edu\nctu\mot A.java
路考表中只有一”d:\my\edu\nctu\mot”,以此起始,
其可以找到名A.java 的案,可是是,A.java 非透make
制,而是我手打指令,所以根本不用到路
考表。因此器根本找不到A.java。
4 javac d:\my\edu\nctu\mot\A.java
在指定的路之下可以找到案,可以成功。
行用的指令有以下,我分解其成功失之原因:
1 java edu.nctu.mot.A
路考表中只有一”.”,以此起始,系自把”.”
成”/”,因此找到”.\edu\nctu\mot”底下的A.class。
2 java -classpath .\edu\nctu\mot A
路考表中只有一”.\edu\nctu\mot”,以此起始,系
A.class,可是在查部的候,A.class 於
edu.nctu.mot package , 所以放置
在”.\edu\nctu\mot\edu\nctu\mot”目之下,因此出
息。
3 java -classpath d:\my\edu\nctu\mot A
路考表中只有一”d:\my\edu\nctu\mot”,以此起始,
系A.class,可是在查部的候,A.class 於
edu.nctu.mot package , 所以放置
在”.\edu\nctu\mot\edu\nctu\mot”目之下,因此出
息。
4 java d:\my\edu\nctu\mot\A
路考表中只有一”.”。但是系根本法接受子的命令。

读书人网 >编程

热点推荐