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()"
});
}
}
Java 言語仕様からわかるように、実行の順序は main メソッドを含むクラスをロードすることから始まります。次に、このクラスのすべての静的変数とメンバー変数を初期化する必要があります (その前に、スーパークラスのすべてのメンバー変数を初期化する必要がありますが、この場合はありません)。
だから、、、実行を開始する前に初期化されるb
とc
思いました。ただし、出力からはそうではないようです。何か不足していますか?l
main