qq_37051970
可爱的男孩子
采纳率0%
2017-09-23 05:59 阅读 1.2k

类加载时构造方法的问题

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

  • caozhy 从今以后生命中的每一秒都属于我爱的人 2017-09-23 06:16

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

    点赞 评论 复制链接分享
  • qq_37051970 可爱的男孩子 2017-09-23 06:31

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

    点赞 评论 复制链接分享

相关推荐