一、

同一目录下,两个文件

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中。

以上全属推论。