题目:
class Text {
//方法区
public static int k = 0;
public static Text t1 = new Text("t1");
public static Text t2 = new Text("t2");
public static int i = print("i");
public static int n = 99;
//堆
public int j = print("j");
static {
print("静态块");
}
public Text(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;//1 2 3 4 5 6 7 8
++n;//1 2 3 4 99 100 101
}//k 1 2 3 4 5 6 7
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;//1 2 3 4 99 100 101
return ++i;//1 2 3 4 5 6 7 8
}
public static void main(String args[]) {
new Text("init");
}
}
答案:
注意(此题坑点):
class AAAA {
private int p = 10;//new的时候赋值一次
public AAAA(){
System.out.println(p);//先执行 private int p = 10在执行 System.out.println(p)
//结果:10
this.p = 910;//这里在赋值一次
System.out.println(p);
//结果:910
}
public static void main(String[] args) {
new AAAA();
}
}
-
如果实例变量赋初始值,会在new对象的时候执行赋值,然后在执行构造方法里的代码!!!
-
static变量还没执行前,使用它,会自动赋该类型默认值
eg.
此题中的public static Text t1 = new Text(“t1”);
new的时候会先执行public int j = print(“j”);在执行 System.out.println((++k) + “:” + str + " i=" + i + " n=" + n);
public static Text t1 = new Text("t1");
public static Text t2 = new Text("t2");
public static int i = print("i");
上面代码在执行中n是从0开始的
public static int n = 99;
下面代码在执行中n从99开始
static {
print("静态块");
}