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
相关产品推荐
相关产品推荐

