javac编译的时候,为啥会把其他的.java文件也编译成.class

当前目录有两个文件
image.png
文件内容如下:
Student.java

public class Student
{
    public Student() 
    {
        System.out.println("testcode");
    }
}

StuTest.java

public class StuTest
{
    public static void main(String[] args) 
    {
        Student s1 = new Student();
    }
}

我执行javac StuTest.java后,为啥会把Student.java也给编译了一下啊?
image.png
我还以为会编译失败,应该先手动编译Student.java,然后再编译StuTest.java这样。

补充 另一种情况

步骤1 如上描述

当前目录:
image.png
第一次编译javac StuTest.java,会将两个类都会编译,生成.class
image.png

步骤2

此时将StuTest.java随便加一行注释,然后再javac StuTest.java。却发现Student.java没有重新编译,.class文件还是上次编译的时间。
为啥这次不会将Student.java再重新编译一下了?
image.png

阅读 3k
2 个回答

因为java隐含的classpath就有当前目录。于是你在当前目录下执行javac的时候,会从CLASSPATH中找到依赖的Student,进而一并编译。

当在CLASSPATH中找不到依赖项的时候就会出错,此时你就需要添加-cp参数指定额外的classpath了

补充一点另外一个回答中没提到的。

javac 在编译时会判断 .class 文件和 .java 文件是否匹配,也就是判断 .java 是否做了修改,如果未修改就不会再次编译,节省资源。
(使用的方式应该是 .class 存放了 .java 文件的 md5,或者其它方式,大致思路应该是这个)
推荐问题