Java中的执行顺序

Jin*_*Jin 4 java order-of-execution

我试图从Thinking in Java中理解这个例子:

package c07;
import com.bruceeckel.simpletest.*;

class Meal {
    Meal() { System.out.println("Meal()"); }
}

class Bread {
    Bread() { System.out.println("Bread()"); }
}

class Cheese {
    Cheese() { System.out.println("Cheese()"); }
}

class Lettuce {
    Lettuce() { System.out.println("Lettuce()"); }
}

class Lunch extends Meal {
    Lunch() { System.out.println("Lunch()"); }
}

class PortableLunch extends Lunch {
    PortableLunch() { System.out.println("PortableLunch()");}
}

public class Sandwich extends PortableLunch {
    private static Test monitor = new Test();
    private Bread b = new Bread();
    private Cheese c = new Cheese();
    private Lettuce l = new Lettuce();

    public Sandwich() {
        System.out.println("Sandwich()");
    }

    public static void main(String[] args) {
        new Sandwich();
        monitor.expect(new String[] {
          "Meal()",
          "Lunch()",
          "PortableLunch()",
          "Bread()",
          "Cheese()",
          "Lettuce()",
          "Sandwich()"
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,从Java语言规范,执行顺序从加载包含main方法的类开始.然后必须初始化此类的所有静态和成员变量(在此之前必须初始化超类的所有成员变量,尽管在这种情况下没有这些变量).

所以我想b,c,l将之前初始化main开始执行.但是,输出似乎并非如此.我错过了什么吗?

Jon*_*eet 5

不,b而且c实例变量.

没有包含类的自动实例化main.仅初始化静态变量.这就好像一些外部来电者写道:

Sandwich.main(args);
Run Code Online (Sandbox Code Playgroud)

所以当你写道:

然后必须初始化此类的所有静态和成员变量

那是错的.只初始化静态变量 - 正常情况下.