gpt4 book ai didi

java - 使用父类(super class)类型过滤模板可以删除对父类(super class)中静态变量的修改

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

为了解释,我将使用一个例子

//Superclass.java
public class Superclass
{
static String TypeInfo = "Superclass";
}
<小时/>
//Subclass.java
public class Subclass extends Superclass
{
static {
TypeInfo = "Subclass";
}
}
<小时/>
//Main.java
public class Main {

public static void main(String[] args)
{
System.out.print(GetTypeInfo(Subclass.class));
}
public static <T extends Superclass> String GetTypeInfo(Class<T> c)
{
return T.TypeInfo;
}
}
<小时/>

当类被模板化时,来自类加载器的所有信息似乎都会丢失,或者jvm采用父类(super class)而不是子类的初始值,为什么子类静态初始化的所有信息在模板化时都会被隐藏?

最佳答案

Subclass ins 从未初始化,因此静态 block 永远不会运行。

根据JLS 12.4.1. "When Initialization Occurs "类仅在以下情况下初始化:

  • 创建了该类的实例
  • 调用类中声明的静态方法
  • 访问类中声明的静态非常量字段
  • 该类是顶级类,并且执行词法嵌套在该类中的断言语句

如果通过声明该字段的类的子类访问字段,则其效果与使用声明该字段的类调用该字段的效果相同。

使用反射也可能会导致初始化。

Subclass 都不满足这些条件,因此静态 block 永远不会执行。

<小时/>

如果 Subclass 已初始化,您将得到预期的结果,例如如果你使用这个主要方法:

public static void main(String[] args) {
new Subclass();
System.out.print(GetTypeInfo(Subclass.class));
}

关于java - 使用父类(super class)类型过滤模板可以删除对父类(super class)中静态变量的修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26074023/

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