具有循环导入的 Java 文件

6 java import javac

我试图了解如何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.classClassP1.class。运行 ClassP1 也能正常工作。

现在我的问题是javac当我只编译 ClassP2 时如何为 ClassP1 生成类文件。为什么当循环引用不存在时不会发生这种情况 - 即当 ClassP2 导入 ClassP1,但 ClassP1 不导入 ClassP2 时?

我还是 Java 新手,并试图了解编译的工作原理。

duf*_*ymo 4

这里没有发生任何循环。听起来您和许多其他人一样,将导入与类加载混淆了。

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 中。