/*大体上顺序是这样的:(也可以说是优先级,同一级的按顺序执行)
1 静态变量,静态代码块(类加载时执行,类不加载不执行)
2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行)
3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private)
*/ public class Test{ public Test(){ System.out.println("类Test构造方法被执行 6"); } { System.out.println("类Test实例代码块被执行 4"); //实例代码块 } private TestInstance ti = new TestInstance(); //实例变量 private static TestInstance ti1 = new TestInstance(2); //静态变量 static{ System.out.println("类Test静态代码块被执行 3"); //静态代码块 } public static void main(String[] args){ //如果不创建对象那么输出 1 2 3 //如果创建对象,那么输出 1 2 3 4 5 6 new Test(); } } class TestInstance{ public TestInstance(){ System.out.println("类TestInstance实例变量被构造 5"); } static{ System.out.println("类TestInstance加载执行静态代码块 1"); } public TestInstance(int i){ System.out.println("类TestInstance静态变量被构造 2"); } } |
public class TestStaticCode { /*大体上顺序是这样的:(也可以说是优先级,同一级的按顺序执行) 1 静态变量,静态代码块(类加载时执行) 2 实例变量,实例代码块(创建对象时执行) 3 构造函数,(创建对象时执行完2后再执行构造函数,不管构造函数是public还是private) */ //测试输出:0 1 2 3 4 //主类加载,首先执行该句静态变量(执行完该句相关的所有语句之后才往下执行),创建对象,那么要执行实例变量、实例代码块 //第一句静态语句执行完成之后才能执行静态代码块 private static TestStaticCode tsc = new TestStaticCode(); static{ System.out.println("4"); } { System.out.println("0"); } private InstanceVariable iv = new InstanceVariable(); //类私有的构造函数 private TestStaticCode(){ System.out.println("3"); } public static void main(String[] args){ } } class InstanceVariable { static{ System.out.println("1"); } public InstanceVariable(){ System.out.println("2"); } } |