在嘗試建立自己的可重用package的時(shí)候,對(duì)package和import語(yǔ)句做了些試驗(yàn),記錄結(jié)果如下。
使用說(shuō)明:
(1)對(duì)于src\com\cjren\util\ClassA.java這個(gè)提供給其他類使用的class.
package com.cjren.util;
public class ClassA {
? ...
}
編譯時(shí):
javac -d . ClassA.java? // -d . 表示了以當(dāng)前目錄為package語(yǔ)句生成的相對(duì)根目錄。
結(jié)果是在ClassA.java所在的目錄下生成了com.cjren.util包,里面含ClassA.class,這個(gè)包可以復(fù)制剪貼到其他的地方供其他類使用。
Notes:
必須使用"-d .",否則ClassA.class并不會(huì)放在com.cjren.util包里面,而是生成在和ClassA.java相同的目錄下。
(2)對(duì)于要使用ClassA的ClassB.java.
import com.cjren.util.ClassA;
public class ClassB {
? ... // use ClassA here
}
To compile: javac ClassB.java
To run:???? 假設(shè)com包放在和ClassB.java的當(dāng)前目錄
??????????? java ClassB???????
??????????? // or java -cp . ClassB // here use the "-cp ." as the current directory to find the package com.
??????????? 假設(shè)com包放在D:\Program Files\Java\mypackages下
??????????? java -cp D:\Program Files\Java\mypackages ClassB
Notes:
錯(cuò)誤一:
package com.cjren.util;
public class ClassA {
? ...
}
編譯后直接把com.cjren.util包里面的ClassA.class文件拷貝到和ClassB.java相同的目錄下直接使用,
public class ClassB {
? ... // use ClassA here
}
To compile: javac ClassB.java
錯(cuò)誤信息是
"ClassB.java:某一行: 無(wú)法訪問(wèn) ClassA
?錯(cuò)誤的類文件: .\ClassA.class
?類文件包含錯(cuò)誤的類: com.cjren.util.ClassA
?請(qǐng)刪除該文件或確保該文件位于正確的類路徑子目錄中。"
想一想為什么出錯(cuò)信息是說(shuō):“錯(cuò)誤的類文件: .\ClassA.class, 類文件包含錯(cuò)誤的類: com.cjren.util.ClassA”呢?因?yàn)?錯(cuò)誤的類文件: .\ClassA.class"當(dāng)中包含了"錯(cuò)誤的類: com.cjren.util.ClassA"這個(gè)信息,而這個(gè)"com.cjren.util.ClassA"是在ClassA.java中的"package com.cjren.util;"語(yǔ)句所造成的。
正確的做法是把ClassA.class所在的包整個(gè)復(fù)制粘貼到ClassB.java所在的目錄下,或者在ClassB.java所在的目錄下人為手動(dòng)的建立com\cjren\util\目錄,然后直接把ClassA.class文件復(fù)制粘貼到此。這暗示了代碼生成的包和手動(dòng)建立的目錄可能是一樣。
可見(jiàn),當(dāng)ClassA.java的源代碼中含"package com.cjren.util;"語(yǔ)句,則生成com.cjren.util包里面的ClassA.class文件里面應(yīng)該就也包含了自己這個(gè)class文件所屬的包信息,所以這個(gè)ClassA.class只能放在這個(gè)代碼中已經(jīng)指定的特定包的路徑下使用,而不能把這個(gè)ClassA.class獨(dú)立出來(lái)使用,因?yàn)檫@樣的話將ClassA.class文件屬性中的的包信息不相符。當(dāng)然當(dāng)這個(gè)ClassA.java沒(méi)有顯式地制定package語(yǔ)句信息時(shí)候,我懷疑(也覺(jué)得應(yīng)該)是默認(rèn)在ClassA.class文件當(dāng)中包含了包的信息就是".",可以理解為默認(rèn)的加入了"package .;"語(yǔ)句。
錯(cuò)誤二:
public class ClassA {
? ...
}
編譯后這個(gè)ClassA.class文件中含有的包的信息是"."當(dāng)前目錄就包!
把這個(gè)ClassA.class文件,移到以ClassB.java所在的目錄為當(dāng)前父目錄的人為手動(dòng)建立的com\cjren\util目錄下。
import com.cjren.util.ClassA;
public class ClassB {
? ... // use ClassA here
}
To compile: javac ClassB.java
錯(cuò)誤信息是
"ClassB.java:某一行: 無(wú)法訪問(wèn) com.cjren.swing.ClassA
?錯(cuò)誤的類文件: .\com\cjren\util\ClassA.class
?類文件包含錯(cuò)誤的類: ClassA
?請(qǐng)刪除該文件或確保該文件位于正確的類路徑子目錄中。"
想一想為什么出錯(cuò)信息是說(shuō):“錯(cuò)誤的類文件: .\com\cjren\util\ClassA.class,類文件包含錯(cuò)誤的類: ClassA”呢?因?yàn)槟氵@個(gè)com.cjren.util包中的ClassA.class文件本來(lái)所默認(rèn)的包信息是".",在ClassA.java中并沒(méi)有使用"package"語(yǔ)句指定ClassA應(yīng)該屬于包c(diǎn)om\cjren\util這個(gè)信息。
小結(jié):
在嘗試過(guò)程當(dāng)中發(fā)現(xiàn),
public class ClassA {
? ...
}
和
package com.cjren.util;
public class ClassA {
? ...
}
這兩個(gè)只差了一個(gè)package語(yǔ)句的class文件大小有十幾到幾十k上的區(qū)別,這可能進(jìn)一步證明了.java文件中的package語(yǔ)句會(huì)在.class文件中加入相應(yīng)的包信息,這個(gè)包信息決定了這個(gè)class被使用時(shí)候的方式(是否需要import特定的包)。
還有一點(diǎn)要注意的是:
package com.cjren.util;
public class ClassA {
? ...
}
之后無(wú)論是使用 javac ClassA.java 或者 javac -d . ClassA.java編譯都不會(huì)影響ClassA.class文件當(dāng)中所含有的包信息,這兩種編譯方式所造成的區(qū)別在上面的使用說(shuō)明中已經(jīng)說(shuō)過(guò)了。
?