class A{ static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Test{ public static void main(String[] ars){ A ab = new B(); //执行到此处,结果: ? System.out.println(""); ab = new B(); //执行到此处,结果: ? } }
变化一下输出结果为什么?class A{ static{ System.out.print("1"); } public A(){ System.out.print("2"); } } class B extends A{ static{ System.out.print("a"); } public B(){ System.out.print("b"); } } public class Test{ public static void main(String[] ars){ B b = new B(); //执行到此处,结果: ? } }
如果上面的例子明白输出结果以及原理,那么java中关于块语句执行顺序就应该彻底的清楚了。 : )class A{ static{ System.out.println("static A"); } { System.out.println("normal A"); } public A(){ System.out.println("constructor A"); } } class B extends A{ static{ System.out.println("static B"); } { System.out.println("normal B"); } public B(){ System.out.println("constructor B"); } } public class Test{ public static void main(String[] ars) throws Exception { A a = new B(); a = new B(); } }