先给结论:
1 类加载从上往下执行,依次执行静态的初始化语句和初始化块,而且类加载优先于对象创建。(静态初始化语句和初始化块只加载一次)
2创建本类的对象时:从上往下执行一次非静态的初始化语向和初始化块,然后执行构造函数。
3 创建另一个类对象时:先加载另一个类的静态语句和静态初始化块(同样也只时第一次才会加载他的静态语句和初始化块,同样也只加载一次)。然后再加载其他类的非静态的初始化语向和初始化块,然后执行构造函数。
4 静态语句初始化时可以创建类对象
5静态方法可以只加载而不调用
接着看结果
代码
public class InitializeDemo {
public static int print(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static int print() {
System.out.println((k++) + ":"+ " i=" + i + " n=" + n);
++n;
return ++i;
}
private static int k = 1;
private static Cat cat = new Cat();
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 void main(String[] args) {
new Cat();
System.out.println("123");
InitializeDemo n =new InitializeDemo("初始化");
}
}
public class Cat {
{
System.out.println("我是cat普通块");
}
static {
System.out.println("我是cat静态块");
}
public static void print() {
System.out.println("我是猫的print静态方法,不会被调用");
}
private static int j = sencound("j");
private static int sencound(String j) {
System.out.println("我是cat的secound方法");
return 1;
}
}