在听课时遇到的一个复杂的类初始化实例问题,在这里进行总结和反思,也是为了更好的可以回看
小试牛刀O(∩_∩)O
答案为:
getPhone
初始化块
构造函数
小结: 静态>类加载>类构建;所以静态方法加载完后,从上到下执行代码。调用getPhone() 先输出getPhone,初始化块属于类加载过程,所以先于构造函数执行。
进阶版
答案:
getPhone
静态代码块
getPhone
初始化块
构造函数
小结 :在此问题中多出来静态变量和静态初始化块的部分,需要注意的是,静态的方法也是调用时才会使用,所有静态的变量和初始化块也要按照从上到下的执行顺序。
终极版
public class InitalDemo {
private static int k = 1;
private static InitalDemo t1 = new InitalDemo("t1");
private static InitalDemo t2 = new InitalDemo("t2");
private static int i=print("i");
private static int n = 99;
{
print("初始化块");
j=100;
}
public InitalDemo(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) {
InitalDemo test = new InitalDemo("test");
}
}
答案:
1:初始化块 i=0 n=0
2:j i= 1 n =1
3:t1 i=2 n=2
4:初始化块 i=3 n=3
5:j i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:初始化块 i=8 n=100
10:j i=9 n=101
11:test i=10 n=102
小结 :
首先static修饰的成员变量和方法是从属于类的, 而普通变量和方法是从属于对象的,在调用某个类的构造方法之前,应该先加载类信息,包括初始化块!之后才能创建对象!
static 优先,但遇到new 则从上到下执行一次非静态初始化语句和初始化块和相应的构造函数
静态优先,构造随后, 先父再子
父类静态代码块 ->子类静态代码块 ->父类非静态代码块 -> 父类构造函数 -> 子类非静态代码块 -> 子类构造函数