gpt4 book ai didi

java - 棘手的编译器行为

转载 作者:行者123 更新时间:2023-11-29 07:22:19 25 4
gpt4 key购买 nike

简单的java代码片段。它分为三类。编译代码后请删除 A.class 然后执行代码。代码还在运行,为什么不检查A的字节码是否存在?

class A {
static {
System.out.println("In the class A");
}

public A() {
}
}

class B {
private A a = null;

static {
System.out.println("In the class B");
}

public B() {
a = new A();
}
}

public class ExampleLinkage {
static {
System.out.println("In the class A");
}

public ExampleLinkage(String str) {
}

public static void main(String args[]) {
try {
System.out.println("In the main method of ExampleLinkage");
Class.forName("com.bt.rtti.B");
} catch(Exception e) {
e.printStackTrace();
}
}
}

最佳答案

我猜想在任何时候都不需要加载类 A,即使 B 中有一个它的实例,因为您永远不会实例化 B 的一个实例。

JVM 在加载类时非常懒惰。它会在您实例化该类的一个对象时(第一次)加载它们,当您使用 Class.forName() 显式加载一个类时,或者当您以其他方式以需要它的信息的方式引用该类时(尝试访问一个来自 B 的静态初始值设定项的 A 的静态成员,并看到 A 将被加载。

关于java - 棘手的编译器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2498663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com