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

发布于 2022-09-13 01:21:14 字数 1148 浏览 19 评论 0

当前目录有两个文件
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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ㄖ落Θ余辉 2022-09-20 01:21:14

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

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

虫児飞 2022-09-20 01:21:14

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文