具有循环导入的Java文件
我试图理解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();
}
}
及
package com.test.p2;
import com.test.p1.ClassP1;
public class ClassP2 {
public static void testP2() {
System.out.println("ClassP2 loaded");
}
}
当我第一次编译ClassP2.java
时,我希望它会失败,因为ClassP1.java
尚未编译,并且没有生成class
文件。然而,它编译了ok,并生成了ClassP2.class
和ClassP1.class
。运行ClassP1也很好
现在我的问题是javac
如何为类p1生成类文件,而我只编译类p2。为什么循环引用不存在时不会发生这种情况?例如,当ClassP2导入ClassP1,但ClassP1不导入ClassP2时
我对Java还是一个新手,并试图了解编译是如何工作的
# 1 楼答案
这不是循环导入的结果,而是在类P2中导入类P1的结果。java和
javac
能够根据传递给javac
的参数和执行命令的位置找到ClassP1的源代码有关javac,请参见文档中的-sourcepath选项:
# 2 楼答案
这里什么都没发生。听起来像是你和其他很多人混淆了导入和类加载
import语句所做的只是允许您在代码中使用短名称来引用Java类:
如果短名称不明确(例如
java.util.Date
和java.sql.Date
在同一个类中),import语句对您没有帮助直到代码在运行时需要时,
java.sql.ResultSet
的字节码才会加载到JVM中