触发类的初始化之后大致顺序是这样的:
1.准备阶段:为类的静态变量分配内存并赋默认值
2.初始化阶段:为静态变量赋值、执行静态代码块
3.初始化实例变量
4.构造方法
(暂不考虑父类的问题)
如果在为静态变量赋值的时候(第二阶段)执行了构造方法,就像单例模式里面getInstence
,之后继续执行的时候,会跳过第四步接着执行吗?还是怎么样?
新手求教 谢谢大佬!!
测试代码
public class TestClass {
public String count="testclass";
public static TestClass testClass=getInstence();
public static int count1;
public static int count2=0;
private TestClass() {
// TODO Auto-generated constructor stub
count1=count1+1;
count2=count2+1;
System.out.println(out());
}
public static TestClass getInstence(){
if(testClass==null){
return new TestClass();
}else{
return testClass;
}
}
public String out(){
return (""+count+" "+count1+" "+count2+" "+"constructor");
}
static class Sub extends TestClass{
public String count="testsub";
public String out(){
return (""+count+" "+count1+" "+count2+" "+"SUB");
}
}
public static void main(String[] args) {
Sub sub=new Sub();
sub.out();
}
}
这是我写的一段测试代码,为了测试静态变量、实例变量初始化时机,以及子类隐藏父类成员时,创建子类对象的一些问题
我的个人理解是:
当开始实例化静态变量testClass是调用构造方法,此时产生了具体对象,所以实例变量也会同时分配内存并赋值,接下来才会继续实例化静态变量count1
,count2,然后实例化子类(此时父类的实例变量先于子类的静态变量实例化)。只是个人的胡思乱想,还请各位帮忙指教
执行结果 :
testclass 1 1 constructor
null 2 1 SUB