类加载时构造方法的问题

触发类的初始化之后大致顺序是这样的:
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

2个回答

单例模式里面getInstence内会调用成员构造函数,在懒惰加载的情况下,构造函数在第一次调用getInstence时候创建,否则在静态构造函数调用中创建。

qq_37051970
可爱的男孩子 哦,受教,楼下是我的代码,不光是单利模式还有其他的问题
2 年多之前 回复

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,然后实例化子类(此时父类的实例变量先于子类的静态变量实例化)。只是个人的胡思乱想,还请各位帮忙指教

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问