You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java主类引用其他类时,是否需要编译所有相关类?

问题

在程序的main方法所在类GameLauncher中创建了GuessGame、Player等类的对象。最初仅编译主类时,Player类的guess方法返回值始终为0(该方法实际有业务代码),编译所有三个类后程序运行正常。原本以为javac遇到未知新类时会自动编译对应的源文件,想了解这一编译规则背后的逻辑。

相关代码:

public class GameLauncher {
    public static void main(String[] args) {
        GuessGame newGame = new GuessGame();
        newGame.startGame();
    }
}
public class GuessGame {
    Player p1;
    Player p2;
    Player p3;
    int targetNumber;

    public void startGame() {
    }
}
public class Player {
    private int number;

    public int guess() {
    }
}
编译规则解析
  • javac自动编译的前提:javac编译主类时确实会自动处理依赖类,但只有在找不到对应类的.class文件,或者源文件(.java)的修改时间比已有的.class文件更新时,才会重新编译依赖的源文件。如果存在旧版本的Player.class(比如之前编译过返回0的版本),javac会直接复用这个旧字节码,不会重新编译Player.java。
  • 仅编译主类的依赖逻辑:只编译GameLauncher.java时,javac会先检查GuessGame的状态——如果GuessGame没有.class文件,会编译它;但对于Player,只要有可用的.class文件(哪怕是旧的),就不会去读取最新的Player.java代码,导致guess方法还是旧的返回0逻辑。
  • 全量编译的作用:编译所有三个类时,javac会逐个处理每个源文件,生成最新的.class文件,此时Player的guess方法的业务代码才会被正确编译,程序运行恢复正常。
  • 确保依赖更新的小技巧:如果想让主类编译时自动更新所有依赖类,可以先删除所有旧的.class文件,再编译主类;或者直接用javac *.java这类全量编译命令,强制所有源文件重新编译。

内容的提问来源于stack exchange,提问作者Augmas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:15:05