1.主方法在加载类外时
public class Test05 {
public static void main(String[] args) {
System.out.println("main start");
new StaticInit();
System.out.println("main end");
}
}
class StaticInit {
public static StaticInit si = new StaticInit();
public StaticInit() {
System.out.println("constructor");
m1();
System.out.println(si);}
public static void m1() {System.out.println("static method"); }
{ System.out.println("instance block"); }
static { System.out.println("static"); }
}
/*结果为
main start
instance block
constructor
static method
null
static
instance block
constructor
static method
com.zzxx.test.StaticInit@282ba1e
main end
*/
注: 1.主方法中 想要new StaticInit(); 先要加载类 2.加载类: 再按顺序加载静态成员 a.先加载si = new StaticInit(); (代码块是在所有构造器执行之前调用) 在构造方法内部输出si, 此时si还没有赋值成功 所以是null b.加载静态方法 - 不会主动执行 c.加载代码块 3.new对象: 调用构造器(代码块是在所有构造器执行之前调用) 在构造方法内部输出si, 此时si已经加载并赋值成功, 所以输入地址
2.主方法在加载类内时
public class Test06 {
static { System.out.println("static"); }
public static Test06 si = new Test06();
public Test06() {
System.out.println("constructor");
m1();
System.out.println(si);
}
public static void m1() {
System.out.println("static method");
}
{ System.out.println("instance block"); }
public static void main(String[] args) {
System.out.println("main start");
new Test06();
System.out.println("main end");
}
}
/*结果为
static
instance block
constructor
static method
null
main start
instance block
constructor
static method
com.zzxx.test.Test06@75412c2f
main end
*/
注:主方法要执行, 先要加载Test06类