gpt4 book ai didi

Java 初始化顺序问题,静态与实例字段

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:53 26 4
gpt4 key购买 nike

下面的程序打印:

my name is:null

my name is:null

Someclass static init

据我所知,当一个类第一次加载时,静态 block 和字段总是首先初始化,实例 block 和字段第二。因此,应首先初始化变量“objectName1”和“objectName2”,然后初始化实例变量“list”……但输出显然与该理论相矛盾……任何人都可以解释程序行为(我不是在寻找对设计本身顺便说一句)?

import java.util.ArrayList;
import java.util.List;

public class Main2{
public static void main (String[] args){
SomeClass.getInstance();
}
}

class SomeClass {
private static final SomeClass instance = new SomeClass();

public static SomeClass getInstance(){
return instance;
}

static {
System.out.println ("Someclass static init");
}
private static String objectName1 ="test1";
private static String objectName2 ="test2";

@SuppressWarnings("serial")
private List<SomeObject> list=
new ArrayList<SomeObject> () { {
add (new SomeObject(objectName1));
add (new SomeObject(objectName2));
}};
}

class SomeObject {
String name;
SomeObject (String name){
this.name = name;
System.out.println ("my name is:" +name);
}
}

最佳答案

静态 block 按顺序初始化(因此您可以在下面的代码中依赖上面的代码)。通过创建 SomeClass 的实例作为 SomeClass 中的第一个静态初始值设定项,您将在静态初始化阶段强制执行实例初始化。

所以你的代码执行的逻辑顺序是:

  • 加载类SomeClass,所有静态字段初始默认(0null等)
  • 开始静态初始化
  • 第一个静态初始化创建 SomeClass 的实例>
  • SomeClass 实例开始实例初始化,使用静态字段的当前值(因此 objectName1objectName2null)
  • 加载SomeObject类,所有静态字段初始默认(你没有)
  • SomeObject 静态初始化(你没有)
  • 使用传入的 null 值创建 SomeObject 的实例
  • 继续SomeClass的静态初始化,设置objectName1objectName2

要使此工作如您所愿,只需将 objectName1objectName2 的初始化放在 instance 的初始化之上。

关于Java 初始化顺序问题,静态与实例字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2423376/

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