package org.sample; class Bread { Bread() { System.out.println("Bread()"); } } class Cheese { Cheese() { System.out.println("Cheese()"); } } class Lettuce { Lettuce() { System.out.println("Lettuce()"); } } public class TestOrder { static { System.out.println("static block - 1 has been executed."); } { System.out.println("non-static - 1 block has been executed."); } private static final Bread bread = new Bread(); private static final Cheese cheese = new Cheese(); static { System.out.println("static block - 2 has been executed."); } private static final Lettuce lettuce = new Lettuce(); private final Bread bread1 = new Bread(); { System.out.println("non-static - 2 block has been executed."); } private final Cheese cheese1 = new Cheese(); private final Lettuce lettuce1 = new Lettuce(); public static void run() { System.out.println("run static method."); } public TestOrder() { System.out.println("create object."); } public static void main(String[] args) { TestOrder.run(); new TestOrder(); } } /* output= static block - 1 has been executed. Bread() Cheese() static block - 2 has been executed. Lettuce() run static method. non-static - 1 block has been executed. Bread() non-static - 2 block has been executed. Cheese() Lettuce() create object. */
之所以补充上面的代码,主要是为了强调:【实例域以及初始化块】的执行也是依赖于代码书写顺序的(自上而下),而并非随机执行或者按照某种优先顺序。不过,一些特殊情况可能需要另当别论。