package com.alibaba.interview;
/**
* 问题:下面语句的输出是什么?
*/
/**
* 非静态变量属于某一指定对象,而不是属于类
* 所以,每次new一个Test对象时,就会执行public int j = print("j")这行代码
*
*/
public class Test {
public static int k = 0;
public static Test t1 = new Test("t1");
public static Test t2 = new Test("t2");
/**
* 在这之前,i的值为0
*/
public static int i = print("i");
/**
* 在这之前,n的值为0
*/
public static int n = 99;
public int j = print("j");
/**
* 构造代码块是给所有对象的共性内容进行初始化,是在建立对象的时候才执行
* 并且优于构造函数
*/
{
print("构造块");
}
/**
* 静态代码块随着类的加载二执行,只执行一次,并优于主函数
*/
static{
print("静态块");
}
public Test(String str){
System.out.println((++k)+" : "+str+" i= "+i+" n="+n);
++i;
++n;
}
public static int print(String str){
System.out.println((++k)+" : "+str+" i= "+i+" n="+n);
++n;
return ++i;
}
public static void main(String[] args) {
new Test("init");
}
}
运行结果:
1 : j i= 0 n=0
2 : 构造块 i= 1 n=1
3 : t1 i= 2 n=2
4 : j i= 3 n=3
5 : 构造块 i= 4 n=4
6 : t2 i= 5 n=5
7 : i i= 6 n=6
8 : 静态块 i= 7 n=99
9 : j i= 8 n=100
10 : 构造块 i= 9 n=101
11 : init i= 10 n=102