我试图了解如何javac处理循环导入。经过几次尝试,我得到了以下要编译的代码:
package com.test.p1;
import com.test.p2.ClassP2;
public class ClassP1 {
public static void main(String[] args) {
System.out.println("ClassP1 loaded");
ClassP2.testP2();
}
}
Run Code Online (Sandbox Code Playgroud)
和
package com.test.p2;
import com.test.p1.ClassP1;
public class ClassP2 {
public static void testP2() {
System.out.println("ClassP2 loaded");
}
}
Run Code Online (Sandbox Code Playgroud)
当我ClassP2.java第一次编译时,我预计它会失败,因为ClassP1.java尚未编译并且没有class生成文件。然而,它编译OK,并产生ClassP2.class和ClassP1.class。运行 ClassP1 也能正常工作。
现在我的问题是javac当我只编译 ClassP2 时如何为 ClassP1 生成类文件。为什么当循环引用不存在时不会发生这种情况 - 即当 ClassP2 导入 ClassP1,但 ClassP1 不导入 ClassP2 时?
我还是 Java 新手,并试图了解编译的工作原理。
这里没有发生任何循环。听起来您和许多其他人一样,将导入与类加载混淆了。
import 语句所做的只是允许您使用短名称来引用代码中的 Java 类:
import java.sql.ResultSet;
public V find() {
ResultSet rs = null; // You can type ResultSet instead of java.sql.ResultSet
}
Run Code Online (Sandbox Code Playgroud)
java.util.Date如果短名称不明确(例如java.sql.Date在同一个类中),导入语句将不会帮助您。
除非您的代码在运行时需要它,否则字节代码java.sql.ResultSet不会加载到 JVM 中。