可爱的男孩子 2017-09-23 05:59 采纳率: 0%
浏览 1193

类加载时构造方法的问题

触发类的初始化之后大致顺序是这样的:
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条回答 默认 最新

  • threenewbee 2017-09-23 06:16
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!