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");
}
}
结果:
首先我们要知道,运行一个类
1、首先初始化静态变量和静态代码块(不 管以后谁调用这个对象,只会初 始化一次)
静态变量的优先级和静态代码块的优先级是-样的,所以谁在谁前面,谁先初始化,我们- -般先写变量,之后再写静态代码块,也就是说先运行静态。
变量的初始化,之后在运行静态代码块的初始化(这样会避免出错===>java:非法前向引用),如下
private static int a;
static {
a=1;
System.out.println(a);
}
定义的a要在使用前定义
2、之后初始化变量和代码块,再之 后在初始化构造器:
变量和代码块的优先级是一样的(谁 在前.谁先初始化),但优先于构造器的初始化也就是说,构造器不管在哪里,都是最后被初始化的因为他们不是静态的,所以他们存在于对象里面,new一个对象就会被初始化一次。
(静态属性=静态代码块)> (非静态属性 = 构造块)> 构造方法
代码执行流程:
1、首先给k赋值1
2、new对象t1
1.先执行初始化块
2.执行private int j = print("j")
3.执行构造器
3、new对象t2
1.先执行初始化块
2.执行private int j = print("j")
3.执行构造器
4、执行private static int i = print("i")
5、给n赋值99
6、执行静态块
7、执行main方法
1. new对象test
1.先执行初始化块
2.执行private int j= prit(j);
3.执行构造器