gpt4 book ai didi

java class.forClass() 与类声明

转载 作者:行者123 更新时间:2023-11-29 07:32:04 31 4
gpt4 key购买 nike

我有一个类(class)学生是

package org.ahmed;

public class Student {

public Student() {
// TODO Auto-generated constructor stub
System.out.println("Generated constructor");
}

static { // static block
System.out.println("Hello world static");
}

{ // insance block
System.out.println("Hello world non static");
}
}

然后

public class Main {

public static void main(String[] args) throws ClassNotFoundException {
Class.forName("org.ahmed.Student"); // this line causing static block execution in Student class
// Student s; // this line doesn't execute the static block.
}
}

我知道通过使用 Class.forClass() 我们可以动态运行任何运行时类。但我对其他情况有一些疑问静态 block 。

如果我在 main 方法中使用 Class.forClass("org.ahmed.Student"),那么它是执行 Student 的静态 block 。但是如果我声明 Student smain 方法不执行静态 block 。我想Class.forClass("ClassName") 等同于用变量声明类姓名。

最佳答案

加载一个类(JLS§5.3,我认为是JLS§5.4)和初始化一个类(JLS§5.5)是有区别的。默认情况下,Class.forName 会同时执行这两项操作,尽管有 an override you can use。这让您可以控制是否初始化该类。

只是声明一个Student 变量不会初始化类。事实上,即使引用 Student.class 也不会初始化该类。您必须执行一些操作来触发初始化,例如使用 newgetstaticputstaticinvokestatic 的操作与类的字节码操作(但有关详细信息,请参阅 §5.5 的链接,还有其他初始化类的东西)。

例如,如果您给 Student 一个公共(public)字段:

public static String foo = "bar";

...然后在 Main.main 中你做了:

System.out.println(Student.foo);

... 将触发类的初始化。

关于java class.forClass() 与类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40781063/

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