一、
同一目录下,两个文件
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 OFFSET JAVAHOME=D:\Java\JDK-8u91-1.8.0_91SET 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中。
以上全属推论。