以下程序打印:
my name is:null
my name is:null
Someclass static init
Run Code Online (Sandbox Code Playgroud)
首次加载类时的AFAIK静态块和字段始终首先被初始化,实例块和字段被初始化.因此变量"objectName1"和"objectName2"应首先初始化,实例变量"list"second ...但是输出明显与此理论相矛盾...任何人都可以解释程序行为(我不是在寻找对它的批评设计本身btw)?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
T.J*_*der 10
静态块按顺序初始化(因此您可以依赖上面的那些).通过创建SomeClass第一个静态初始化程序SomeClass的实例,您将在静态初始化阶段强制实例初始化.
因此,代码执行的逻辑顺序是:
SomeClass,所有静态字段最初的默认值(0,null,等)SomeClassSomeClass例如,使用静态字段的当前值开始实例inits (so objectName1和objectName2are null)SomeObject类,所有静态字段最初默认(你没有)SomeObject静态inits(你没有)SomeObject使用传入null值的实例SomeClass,设置objectName1和objectName2为了使这项工作,你可能期望的那样,简单地把inits为objectName1和objectName2初始化以上instance.
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |