【Java】面试题,类加载顺序问题

package com.mobai.study0131.Home2;
public class Demo2 {
    public static int k = 0;
    public static Demo2 t1 = new Demo2("t1");
    public static Demo2 t2 = new Demo2("t2");
    public static int i = print("i");
    public static int j = print("j");
    public static int n = 99;

    {
        print("constructor code");
    }
    static {
        print("static code");
    }
    public static int print(String s) {
        System.out.println("i="+i +"   "+s+ "  k=" + k + "  n=" + n + "   j=" + j);
        ++i;
        ++k;
        ++n;
        return i;
    }
    public Demo2(String string) {

        print(string);
    }
    public static void main(String[] args) {
        Demo2 d=new Demo2("T");
    }
}

求以上代码的输出结果,并分析原因:

代码分为以下几步完成:

第一步:初始化静态变量

先给所有静态变量开辟空间,此时:k=0,t1=null,t2=null,i=0,j=0,n=0;

然后回过头再给每个变量赋值,程序进行步骤:k=0;

到t1时会new一个Demo2对象,调用构造方法,但在此之前有一个构造代码块,所以先执行构造代码块,执行完后打印:i=0   constructor code  k=0  n=0   j=0,执行完构造代码块后,此时:k=1,t1=null,t2=null,i=1,j=0,n=0;

然后执行构造方法,执行完后打印:i=1   t1  k=1  n=1   j=0,执行完构造方法后,此时:k=2,t1=对象,t2=null,i=2,j=0,n=2;

继续往下到t2时会new一个Demo2对象,调用构造方法,但在此之前有一个构造代码块,所以先执行构造代码块,执行完后打印:i=2   constructor code  k=2  n=2   j=0,执行完构造代码块后,此时:k=3,t1=对象,t2=null,i=3,j=0,n=3;

然后执行构造方法,执行完后打印:i=3   t2  k=3  n=3   j=0,执行完构造方法后,此时:k=4,t1=对象,t2=对象,i=4,j=0,n=4;

继续往下走,给i赋值,调用print(“i”);打印:i=4   i  k=4  n=4   j=0,此时:k=5,t1=对象,t2=对象,i=5,j=0,n=5;

继续往下走,给j赋值,调用print(“j”);打印:i=5   j  k=5  n=5   j=0,此时:k=6,t1=对象,t2=对象,i=6,j=6,n=6;

继续往下走,给n赋值,n=99,此时:k=6,t1=对象,t2=对象,i=6,j=6,n=99。

到此所有静态变量初始化完毕!

第二步:执行静态代码块

        调用print方法,打印:i=6   static code  k=6  n=99   j=6,

        此时:k=7,t1=对象,t2=对象,i=7,j=6,n=100

到此时类加载完成!

第三步:进入主方法

        进入主方法后new了一个Demo2对象,需调用构造方法:

               在此之前要先执行构造代码块,调用print方法

               打印:i=7   constructor code  k=7  n=100   j=6

               此时:k=8,t1=对象,t2=对象,i=8,j=6,n=101

               然后执行构造方法,调用print方法:

               打印:i=8   T  k=8  n=101   j=6

               此时:k=9,t1=对象,t2=对象,i=9,j=6,n=102

至此,程序执行完毕。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值