看如下程序
[html]
class Window{
public Window(int maker) {
System.out.println("Window("+maker+")");
}
}
class House{
Window w1 = new Window(1);
public House() {
System.out.println("House()");
w3 = new Window(33);
}
Window w2 = new Window(2);
void f(){
System.out.println("f()");
}
Window w3 = new Window(3);
}
public class Test {
public static void main(String[] args) {
House h = new House();
h.f();
}
}
/*
结果如下:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*/
分析:普通变量在类中的任何方法(包括构造函数)之前初始化(规则一)。
2.静态变量的初始化
[html]
class Bowl{
public Bowl(int maker) {
System.out.println("Bowl("+maker+")");
}
void f1(int maker){
System.out.println("f1("+maker+")");
}
}
class Table{
static Bowl bowl1 = new Bowl(1);
static Bowl bowl2 = new Bowl(2);
public Table() {
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int maker){
System.out.println("f2("+maker+")");
}
}
class Cupboard{
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
static Bowl bowl5 = new Bowl(5);
public Cupboard() {
System.out.println("cupboard()");
bowl4.f1(2);
}
void f3(int maker){
System.out.println("f3("+maker+")");
}
}
public class Test {
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
public static void main(String[] args) {
System.out.println("creating new cupboard() in main");
new Cupboard();
System.out.println("creating new cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
}
/*
结果如下:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
cupboard()
f1(2)
creating new cupboard() in main
Bowl(3)
cupboard()
f1(2)
creating new cupboard() in main
Bowl(3)
cupboard()
f1(2)
f2(1)
f3(1)
*/
分析:
1.首先程序总共有4个类(Bowl,Table,Cupboard,Test),Bowl没有静态变量和静态方法;Table中有静态变量bowl1、bowl2;Cupboard中有普通变量bowl3,静态变量bowl4、bowl5;Test中有静态变量table、cupboard。
2.根据规则:使用static命名的变量或者使用static{}包括起来的区域,都在类被加载时进行初始化(规则二)。
3.
虚拟机首先加载Test,需要初始化table变量,加载Table类。Table类中有静态变量bowl1,bowl2,初始化它们,输出"Bowl(1),Bowl(2)",再调用构造函数来new对象,输出"Table(),f1(1)"。然后加载Cupboard类,初始化静态变量bowl4,bowl5,输出"Bowl(4),Bowl(5)",调用构造函数来new对象,首先初始化普通变量bowl3,输出"Bowl(3)",然后构造函数,输出"cupboard(),f1(2)"。
4.执行main方法,先输出"creating new cupboard() in main",执行new Cupboard(),这时静态变量都初始化了,不必继续初始化。初始化一般变量bowl3,输出"bowl3",然后调用构造函数,输出"cupboard(),f1(2)"。在输出"creating new cupboard() in main",同理输出"bowl3,cupboard(),f1(2)",最后继续执行main函数,输出"f2(1),f3(1)"。
3.静态代码块的初始化
[
html]
class Spoon{
public Spoon(int maker) {
System.out.println("Spoon("+maker+")");
}
static int i;
static Spoon s = new Spoon(1);
static{
System.out.