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

阅读 2.9k
2 个回答

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

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

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

javac 在编译时会判断 .class 文件和 .java 文件是否匹配,也就是判断 .java 是否做了修改,如果未修改就不会再次编译,节省资源。
(使用的方式应该是 .class 存放了 .java 文件的 md5,或者其它方式,大致思路应该是这个)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题