一、
同一目錄下,兩個文件
t.java
console.bat
t.java:
package t; public class t{ public static void main(String[] args){ System.out.println("Hello world!"); } }
console.bat:
@ECHO OFF SET JAVAHOME=D:\Java\JDK-8u91-1.8.0_91 SET PATH=%PATH%;%JAVAHOME%\bin;%JAVAHOME%\lib\dt.jar;%JAVAHOME%\bin\tools.jar;.; cmd
(console在此處配置路徑)
打開console.bat,在其中編譯並運行t.java,結果如下:
如果java靠環境變量找到java類文件,那麼java t按理應該是可以運行的(因爲當前目錄已被包含在環境變量中,參見console.bat)
二、
如果把t.java中的package t;註釋掉就可以運行。這就跟我們平常直接新建一個java文件,碼碼完直接命令行運行是一樣的。這就可以用classpath來解釋t.class是怎麼被找到的。如果把當前路徑去掉,又會提示找不到主類。所以,可以推斷,主類是通過PATH中的路徑找到的。可是這又怎麼解釋第一種情況呢?
三、
如圖,t1文件夾中也有一個t1.java文件,它跟t0.java的區別在於它有package t1;, 而t0.java並沒有package語句。
兩者運行情況如下:
對於t0.java,一個是t0.class==classpath/t0/t0;一個是classpath+=t0,t0.class==classpath/t0。t1.java相似。依據上面的情況,也就是說,如果java命令後的類文件沒有包含父目錄,那麼該源文件本身就沒有package語句,反之。所以,java不僅靠PATH路徑來找的類文件,而它還通過這兩種殊途同歸的方式來檢查package,以至於不會發生這種“java文件自身聲明所在包與實際所在包不符”的情況。
結論:java x/x/x/aClass能運行意味着aClass在package x.x.x中。
以上全屬推論。