可爱的男孩子 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时候创建,否则在静态构造函数调用中创建。

    评论

报告相同问题?

悬赏问题

  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 关于无人驾驶的航向角
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了