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开始执行.但是,输出似乎并非如此.我错过了什么吗?
不,b而且c是实例变量.
没有包含类的自动实例化main.仅初始化静态变量.这就好像一些外部来电者写道:
Sandwich.main(args);
Run Code Online (Sandbox Code Playgroud)
所以当你写道:
然后必须初始化此类的所有静态和成员变量
那是错的.只初始化静态变量 - 正常情况下.
| 归档时间: |
|
| 查看次数: |
5295 次 |
| 最近记录: |