类的初始化

public class InitializeDemo {
    private static int k = 1;
    private static InitializeDemo t1 = new InitializeDemo("t1");
    private static InitializeDemo t2 = new InitializeDemo("t2");
    private static int i = print("i");
    private static int n = 99;

    {
        print("初始化块");
        j=100;
    }
    public InitializeDemo(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "    n=" + n);
        ++i;
        ++n;

    }
    static {
        print("静态块");
        n=100;
    }
    private int j = print("j");
    public static int print(String str) {
        System.out.println((k++) + ":" + str + "   i=" + i + "    n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {
        InitializeDemo test = new InitializeDemo("test");
    }

}

程序由main方法作为唯一入口,要创建InitializeDemo这个类对象,创建之前,要先检测这个类有没有被加载过,没有加载过,要先加载这个类,进行类的初始化(类加载如方法区的时候,也默认为类中的静态方法和变量在方法区的内存空间申请了地址,即为k,t1,t2,i和n都申请了地址空间,只是这个时候k=0,t1为null,i=n=0),程序由上到下执行静态的代码和代码块。

首先将k赋值为1,然后执行t1的构造方法,这时又涉及到了这个类的创建,因为不是第一次创建这个对象,因此只会从上到下执行一遍非静态的初始化语句和初始化块。

所以首先执行,print("初始化块"),打印  1 :初始化块   i=0 n=0 ,在执行对n和i的加1操作,j=100没有用,赋值完被释放了。

再执行 private int j = print("j"); 打印  2 :j i=1 n=1 ,在执行对n和i的加1操作,并对j赋值2.

最后执行t1的构造方法,打印  3:t1 i=2 n=2,再对n和i进行+1操作。

接着程序执行到了第三行,重复上面的步骤,从上到下执行一遍非静态的初始化语句和初始化块,最后执行构造方法,获得如下打印

4:初始化块   i=3    n=3
5:j   i=4    n=4
6:t2   i=5    n=5

之后执行程序的第四行,打印7:i  i=6 n=6,对n进行+1操作,再将i+1后的结果,返回给i,此时i=7,n=7。

之后执行程序的第五行,对n赋值为99,此时i=7,n=99

再向下执行静态语句或代码块,执行代码块中的print("静态块"),打印8:静态块  i=7 n=99,再对i和n作加一操作

向下执行,对n赋值100。

静态语句和块执行完毕,从上到下执行一遍非静态的初始化语句和初始化块

9:初始化块   i=8    n=100
10:j   i=9    n=101

最后执行test的构造方法,打印11:test   i=10    n=102

结束!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值