gpt4 book ai didi

java - 终端不覆盖 .class 文件

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:28 26 4
gpt4 key购买 nike

我现在正在参加java编程类(class),这是我第一次真正的编程体验(尽管我之前已经做过一些编程)。对于这门课,我必须使用 jEdit 来编写程序,并使用终端来编译和运行它们(我有一台 Mac,自动编译、运行和调试程序的程序出于教育目的而被禁止)。起初,一切进展顺利,但几天前,当我尝试编译 QuickSort 程序时,终端停止覆盖该程序上的 .class 文件。我更改了代码,使其在运行时看起来完全不同,但是在我编译并运行它之后,没有任何变化。但是,如果我在重新编译之前删除 .class 文件,则下次运行时会实现更改。我和我的老师都无法找到有关此问题或如何解决它的任何信息(在我发生这种情况的三天前,我的一个同学也发生了完全相同的事情,而且我们是类唯一的 mac 用户)。如果有人知道问题是什么,如何解决它,或者我在哪里可以找到知道如何解决它的人,我将非常感激。每次编译程序时删除五个 .class 文件是一个巨大的痛苦,并且已经给我带来了一些严重的问题。非常感谢您的帮助!

*编辑:我运行的是 mac os x 10.8.5

最佳答案

编译器在检测哪些类文件已过期方面不够智能,因此要么使用 javac *.java 手动告诉它重新编译所有内容,要么使用构建工具,例如 Ant .

<小时/>

编译器不重新编译所有类的原因是它试图变得“聪明”,并通过仅重新编译已更改的文件来避免不必要的工作。如果 .class 文件比匹配的 .java 文件新,则源代码自上次编译以来未发生更改,因此不会重新编译该类。

当多个文件具有依赖链时,这可能会导致问题。考虑这个简单的例子:

// file: A.java
public class A { public static void main(String[] args) { new B().run(); } }

// file: B.java
public class B { void run() { new C().run(); } }

// file: C.java
public class C { void run() { System.out.println("hello world"); } }

第一次编译A时,编译器会发现它引用了B,而B又引用了C。所有三个都已编译,一切顺利。

如果 B.java 被修改并且 A 被重新编译,编译器会看到 A 引用 B,并且由于 B.javaB.class 更新,因此会重新编译。它不会重新编译 C,因为 C.java 尚未更改。一切都还好。

但是,如果修改了 C.java 并重新编译了 A,编译器会发现 A 依赖于 B,但由于 B.java 没有更改,因此不会重新编译。因此,即使 C.java 已更改,编译器也永远不会到达 C 并且不会重新编译它。

关于java - 终端不覆盖 .class 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20167957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com