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
至此,程序执行完毕。