學(xué)好JAVA最關(guān)鍵幾點
第一個是path 和
CLASSPATH的問題
第二個是package和import問題
第三個是public,protected,private,static,什 么時候用,為什么要用,怎么用
第四個是制作jar文件
?
第一個,path 和 CLASSPATH的問題
什么是path
?是你的JDK的工作路徑
例如 你的jdk安裝在C:/jdk/ 此時的你的path(如果原來沒有PATH)設(shè)置為 PATH ;C:/jdk/ bin
?什么是Classpath
Classpath是Java中的重要概念,它描述了Java虛擬機(jī)在運行一個Class時在哪些路徑中加載要運行的類以及運行的類要用到的類。簡單的說,當(dāng)一個程序找不到他所需的其他類文件時,系統(tǒng)會自動到CLASSPATH環(huán)境變量所指明的路徑中去查找第三方提供的類和用戶定義的類,
?Classpath和Java包的關(guān)系
Java的包(Package)和classpath關(guān)系密切。包是以“.”分割的,SUN建議使用域名的逆向排列來區(qū)分不同的包,以避免沖突,如com.company.util。在一個包里的類在存儲的時候需要存儲在和包名相同的目錄里,如上述com.company.util包中的Sample.class,要存儲在com\company\util目錄中。
Classpath有兩種表達(dá)方式,一種是指向目錄的classpath,如C:\work\classes,表示C:\work\classes目錄是一個classpath條目;另一種方式是指向壓縮文件的classpath,如C:\work\util.jar,表示C:\work\util.jar文件是一個classpath條目,任何一個包含Java類的zip格式的壓縮文件都可以作為classpath的條目。
那么classpath和包到底是什么關(guān)系呢?簡單的說,就是Java虛擬機(jī)在加載類的時候以這樣一種方式查找具體的類文件:classpath+包存儲的目錄+具體的類文件。如classpath中有一個c:\work\classes條目,需要加載的類是com.company.util.Sample.class,那么在加載這個類的時候,虛擬機(jī)會查找c:\work\classes\com\company\util目錄,如果Sample.class在這個目錄中,虛擬機(jī)就可以找到,如果這個類不在這個目錄中,同時也不在任何一個其它classpath中,那么虛擬機(jī)會拋出一個ClassNotFoundException。
Classpath的順序和類版本沖突
Java虛擬機(jī)在加載類的時候查找classpath是有順序的,如果在classpath中有多個條目都有同一個名稱的類,那么在較前位置的類會被加載,后面的會被忽略。這種按照順序的類加載可能會導(dǎo)致類的版本沖突。例如classpath=c:\servlet2.2\servlet.jar;c:\servlet2.3\servlet.jar,那么在實際應(yīng)用的過程中,你使用的是servlet2.2,而不是servlet2.3。很多時候如果不注意這一點,可能會導(dǎo)致奇怪的異常。
命令行狀態(tài)下的classpath設(shè)置
命令行狀態(tài)下的classpath可以通過兩種方式設(shè)置。
一種是直接設(shè)置環(huán)境變量,例如在windows環(huán)境下,我們使用set命令:
set classpath=c:\work\classes;c:\work\util.jar
另一種方式是在執(zhí)行javac、java或者其它Java命令時直接指定classpath:
java -classpath c:\work\classes;c:\work\util.jar com.company.util.Sample
二 package和import問題
Java中的包(Package)其實指的就是目錄,它是為了更好地管理Java類(Class)和接口(Interface)。Java語言的包可以被另一個Java開發(fā)包所使用。如果我們要引用某個包中的類,用import關(guān)鍵字來標(biāo)明即可,
Package
行要在
import 行之前 ,Package打包后將生成在
Classpath 指明的路徑下
例如? Classpath 為 C:/test
Package? com.dir
結(jié)果為 將在C:/test目錄下生成com子目錄,目錄com包含dir目錄 所有的文件將放在dir目錄
在Java中對象的體現(xiàn)在包的定義和應(yīng)用中,對于已經(jīng)編好的類,如果在新類中要使用,應(yīng)將已經(jīng)定義的類包含近來,Java中用import語句實現(xiàn).
???? 使用import 語句的加入所有類(以上面Package打包為例)
?? import com.dir.*;
使用import 語句的加入特指類(以上面 Package 打包為例,假如目錄中存在hello.class)
?import com.dir.hello;
第三,public,protected,private,static,什 么時候用,為什么要用,怎么用
每個類都創(chuàng)造了有自己的名字空間,指方法和變量可以知道彼此的存在,可以使用。?
???? public類不但可以被同一程序包中的其它類使用,別的程序包中的類也可以使用;?
????變量和方法的修飾字public、protected、private:?
????public:任何其他類、對象只要可以看到這個類的話,那么它就可以存取變量的數(shù)據(jù),或使用方法。?
????class?ABC{?
????????public?int?pub_i=5;?
????????public?void?show)(){?
????????System.out.println("pub_i"+pub_i);?
????}?
????class?Demo{?
????????public?static?void?main(String?args[]){?
????????ABC?abc=new?ABC();?
????????System.out.println("abc.pub_i"+abc.pub_i);?
????????abc.pub_i=10;?
????????abc.show();?
????????}?
????}
????protected變量和方法:?
????如果一個類中變量或方法有修飾字protected,同一類、同一包可以使用。不同包的類要使用,必須是該類的子類,可以存取變量或調(diào)用。?
????public?class?ABC{?
????????protected?int?pro_i=5;?
????????protected?void?show(){?
????????System.out.println("pro_i="?+pro_i);}?
????}?
????同包的類:?
????class?DEF{?
????????public?static?void?main(String??args[]){?
????????????ABC?abc=new?ABC();?
????????????System.out.println("abc.pro_i="+abc.pro_i);?
????????????abc.pub_i=10;?
????????????abc.show();?
????????}?
????}?
????不同包但是是子類:?
????import?mytest.pack.ABC;?
????class?DEF?extends?ABC{?
????public?static?void?main(String?agrs[]){?
????????DEF?def=new?DEF();?
????????System.out.println(def.i);?
????????def.i=10;?
????????def.show();}?
????}?
????private不允許任何其他類存取和調(diào)用;
????當(dāng)子類中的變量名與父類的相同,原來的變量被遮蓋。?
????方法的覆蓋(overriding)和重載(overloading)。子孫類中定義的方法和祖先類中某個方法同名、同參數(shù)行,則祖先類中的該方法被覆蓋;方法的重載是指一個對象的多態(tài)性,即多個方法用相同的名稱,但參數(shù)行不同。?
????final:?
????????final在方法之前,防止該方法被覆蓋;?
????????final在類之前,標(biāo)是該類不能被繼承;?
????????final在變量之前,定義一個常量。?
????static:?
????在變量或方法之前,表明它們是屬于類的;?
????靜態(tài)變量在各實例間共享,如果是public靜態(tài)變量,則其它類可以不通過實例化訪問它們;?
????靜態(tài)方法稱為類的方法,因此不用實例化即可調(diào)用(面向過程)?
????一個對象的方法可以訪問對象的數(shù)據(jù)成員,盡管不屬于方法的局部變量;一個類的方法只能訪問自己的局部變量。?
????例:不正確的引用?
????class?StaticError{?
????????String?mystring="hello";?
????????public?static?void?main(String?args[]){?
????????????System.out.println(mystring);}?
????????}?
????錯誤信息:can’t?make?a?static?reference?to?nonstatic?variable.?
????為什么不正確?只有對象的方法可以訪問對象的變量。?
????解決的辦法:?
????????1) 將變量改稱類變量?
????class?StaticError{?
????????static?String?mystring="hello";?
????????????public?static?void?main(String?args[]){?
????????????System.out.println(mystring);}?
????}?
????????2) 先創(chuàng)建一個類的實例?
????class?NoStaticError{?
????????public?static?void?main(String?args[]){?
????????????String?mystring="hello";?
????????????System.out.println(mystring);}?
????????}?
????}
?
第四個,制作jar文件
JAR 文件就是 Java Archive File,顧名思意,它的應(yīng)用是與 Java 息息相關(guān)的,是 Java 的一種文檔格式。JAR 文件非常類似 ZIP 文件——準(zhǔn)確的說,它就是 ZIP 文件,所以叫它文件包。JAR 文件與 ZIP 文件唯一的區(qū)別就是在 JAR 文件的內(nèi)容中,包含了一個 META-INF/MANIFEST.MF 文件,這個文件是在生成 JAR 文件的時候自動創(chuàng)建的
jar 命令詳解
jar 是隨 JDK 安裝的,在 JDK 安裝目錄下的 bin 目錄中,Windows 下文件名為 jar.exe,Linux 下文件名為 jar。它的運行需要用到 JDK 安裝目錄下 lib 目錄中的 tools.jar 文件。不過我們除了安裝 JDK 什么也不需要做,因為 SUN 已經(jīng)幫我們做好了。我們甚至不需要將 tools.jar 放到 CLASSPATH 中。
使用不帶任何的 jar 命令我們可以看到 jar 命令的用法如下:
jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目錄] 文件名 ...
其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一個,它們分別表示:
-c 創(chuàng)建新的 JAR 文件包
-t 列出 JAR 文件包的內(nèi)容列表
-x 展開 JAR 文件包的指定文件或者所有文件
-u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)
[vfm0M] 中的選項可以任選,也可以不選,它們是 jar 命令的選項參數(shù)
-v 生成詳細(xì)報告并打印到標(biāo)準(zhǔn)輸出
-f 指定 JAR 文件名,通常這個參數(shù)是必須的
-m 指定需要包含的 MANIFEST 清單文件
-0 只存儲,不壓縮,這樣產(chǎn)生的 JAR 文件包會比不用該參數(shù)產(chǎn)生的體積大,但速度更快
-M 不產(chǎn)生所有項的清單(MANIFEST〕文件,此參數(shù)會忽略 -m 參數(shù)
[jar-文件] 即需要生成、查看、更新或者解開的 JAR 文件包,它是 -f 參數(shù)的附屬參數(shù)
[manifest-文件] 即 MANIFEST 清單文件,它是 -m 參數(shù)的附屬參數(shù)
[-C 目錄] 表示轉(zhuǎn)到指定目錄下去執(zhí)行這個 jar 命令的操作。它相當(dāng)于先使用 cd 命令轉(zhuǎn)該目錄下再執(zhí)行不帶 -C 參數(shù)的 jar 命令,它只能在創(chuàng)建和更新 JAR 文件包的時候可用。
文件名 ... 指定一個文件/目錄列表,這些文件/目錄就是要添加到 JAR 文件包中的文件/目錄。如果指定了目錄,那么 jar 命令打包的時候會自動把該目錄中的所有文件和子目錄打入包中。
下面舉一些例子來說明 jar 命令的用法:
1) jar cf test.jar test
該命令沒有執(zhí)行過程的顯示,執(zhí)行結(jié)果是在當(dāng)前目錄生成了 test.jar 文件。如果當(dāng)前目錄已經(jīng)存在 test.jar,那么該文件將被覆蓋。
2) jar cvf test.jar test
該命令與上例中的結(jié)果相同,但是由于 v 參數(shù)的作用,顯示出了打包過程,如下:
標(biāo)明清單(manifest)
增加:test/(讀入= 0) (寫出= 0)(存儲了 0%)
增加:test/Test.class(讀入= 7) (寫出= 6)(壓縮了 14%)
3) jar cvfM test.jar test
該命令與 2) 結(jié)果類似,但在生成的 test.jar 中沒有包含 META-INF/MANIFEST 文件,打包過程的信息也略有差別:
增加:test/(讀入= 0) (寫出= 0)(存儲了 0%)
增加:test/Test.class(讀入= 7) (寫出= 6)(壓縮了 14%)
4) jar cvfm test.jar manifest.mf test
運行結(jié)果與 2) 相似,顯示信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 內(nèi)容不同,是包含了 manifest.mf 的內(nèi)容
5) jar tf test.jar
在 test.jar 已經(jīng)存在的情況下,可以查看 test.jar 中的內(nèi)容,如對于 2) 和 3) 生成的 test.jar 分別應(yīng)該此命令,結(jié)果如下;
對于 2)
META-INF/
META-INF/MANIFEST.MF
test/
test/Test.class
對于 3)
test/
test/Test.class
6) jar tvf test.jar
除顯示 5) 中顯示的內(nèi)容外,還包括包內(nèi)文件的詳細(xì)信息,如:
?0 Wed Jun 19 15:39:06 GMT 2002 META-INF/
86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF
?0 Wed Jun 19 15:33:04 GMT 2002 test/
?7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class
7) jar xf test.jar
解開 test.jar 到當(dāng)前目錄,不顯示任何信息,對于 2) 生成的 test.jar,解開后的目錄結(jié)構(gòu)如下:
==
|-- META-INF
| `-- MANIFEST
`-- test
`--Test.class
8) jar xvf test.jar
運行結(jié)果與 7) 相同,對于解壓過程有詳細(xì)信息顯示,如:
創(chuàng)建:META-INF/
展開:META-INF/MANIFEST.MF
創(chuàng)建:test/
展開:test/Test.class
9) jar uf test.jar manifest.mf
在 test.jar 中添加了文件 manifest.mf,此使用 jar tf 來查看 test.jar 可以發(fā)現(xiàn) test.jar 中比原來多了一個 manifest。這里順便提一下,如果使用 -m 參數(shù)并指定 manifest.mf 文件,那么 manifest.mf 是作為清單文件 MANIFEST 來使用的,它的內(nèi)容會被添加到 MANIFEST 中;但是,如果作為一般文件添加到 JAR 文件包中,它跟一般文件無異。
10) jar uvf test.jar manifest.mf
與 9) 結(jié)果相同,同時有詳細(xì)信息顯示,如:
增加:manifest.mf(讀入= 17) (寫出= 19)(壓縮了 -11%)
關(guān)于 JAR 文件包的一些技巧
1) 使用 unzip 來解壓 JAR 文件
在介紹 JAR 文件的時候就已經(jīng)說過了,JAR 文件實際上就是 ZIP 文件,所以可以使用常見的一些解壓 ZIP 文件的工具來解壓 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等來解壓是因為它們解壓比較直觀,方便。而使用 unzip,則是因為它解壓時可以使用 -d 參數(shù)指定目標(biāo)目錄。
在解壓一個 JAR 文件的時候是不能使用 jar 的 -C 參數(shù)來指定解壓的目標(biāo)的,因為 -C 參數(shù)只在創(chuàng)建或者更新包的時候可用。那么需要將文件解壓到某個指定目錄下的時候就需要先將這具 JAR 文件拷貝到目標(biāo)目錄下,再進(jìn)行解壓,比較麻煩。如果使用 unzip,就不需要這么麻煩了,只需要指定一個 -d 參數(shù)即可。如:
unzip test.jar -d dest/
2) 使用 WinZip 或者 WinRAR 等工具創(chuàng)建 JAR 文件
上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具創(chuàng)建所需要 ZIP 壓縮包,再往這個 ZIP 壓縮包中添加一個包含 MANIFEST 文件的 META-INF 目錄即可。對于使用 jar 命令的 -m 參數(shù)指定清單文件的情況,只需要將這個 MANIFEST 按需要修改即可。
3) 使用 jar 命令創(chuàng)建 ZIP 文件
有些 Linux 下提供了 unzip 命令,但沒有 zip 命令,所以需要可以對 ZIP 文件進(jìn)行解壓,即不能創(chuàng)建 ZIP 文件。如要創(chuàng)建一個 ZIP 文件,使用帶 -M 參數(shù)的 jar 命令即可,因為 -M 參數(shù)表示制作 JAR 包的時候不添加 MANIFEST 清單,那么只需要在指定目標(biāo) JAR 文件的地方將 .jar 擴(kuò)展名改為 .zip 擴(kuò)展名,創(chuàng)建的就是一個不折不扣的 ZIP 文件了,如將上一節(jié)的第 3) 個例子略作改動:
jar cvfM test.zip test
# re: 學(xué)好JAVA最關(guān)鍵幾點 2006-08-11 08:29 朱正友 回復(fù) 更多評論
很不錯