1

我已经开始学习java中的包。我了解了import关键字。现在我的疑问是当我们在java中导入任何类时正在导入的是.class文件还是.java文件。

4

2 回答 2

3

Java 文件中的 Animport仅允许您通过短名称而不是完全限定名称来引用类。

因此,如果您使用一个名为的类some.package.CoolClass,那么您可以在代码中的任何地方使用该全名,或者只是放在import some.package.CoolClass;顶部并CoolClass在您的代码中调用它。

编译器需要能够加载您正在使用的类(无论您是否导入它),这意味着它要么需要找到该类的 .class 文件,要么同时编译 .java 文件(即如果您有两个类AB同时编译它们,那么每个类都可以引用另一个,即使当时技术上没有它们的任何类文件)。

在运行时(即当您实际执行代码时),您需要在类路径中使用的每个类的 .class 文件。(运行时不使用 .java 文件)。同样,import在代码中使用短名称还是使用完全限定名称都没有关系。

于 2020-01-07T10:33:38.650 回答
2

编译器是否使用 .class 或 .java 文件进行导入?

答:.class 文件,可能编译 .java 文件。

这有效,即使在以下情况下(没有 .class 文件时):

// p/a/A.java
package p.a;
import p.b.B;
public class A {
    public static final A DEFAULT_A = new B();
}

// p/b/B.java
package p.b;
import p.a.A;
public class B extends A {
}

可以处理这个(循环依赖)的原因是 .class 文件与 .obj / .o 目标文件相当:在 .class 文件中有符号信息(类和方法名称)。正如目标文件通过链接器链接到可执行文件或库一样,java 类加载器会解析所有内容。

于 2020-01-07T10:57:06.020 回答