在上一篇文章中讲述了类的成员变量及成员函数的初始化顺序,以及不同类型的成员变量被初始化的次数。在Java中,除了可以在定义成员变量的时候对成员变量进行初始化,还可以通过显示的初始化块来对成员变量进行初始化。
对于显示的初始化代码块,我们可以提出以下几个问题:
1)它何时被执行?(相对于成员变量的定义以及构造函数的执行时间)
2)它被执行几次?
为了解决这两个问题,我们进行了两轮实验。
在第一轮实验中,我们对显示初始化块的执行顺序问题进行了测试。
测试一:
public class Spoon
{
static
{
i = 47;
}
static int i = 1;
Spoon()
{
i = 10;
}
public static void main(String[] args)
{
System.out.println("i = " + Spoon.i);
}
}
实验结果:
i = 1
测试二:
public class Spoon
{
static int i = 1;
static
{
i = 47;
}
Spoon()
{
i = 10;
}
public static void main(String[] args)
{
System.out.println("i = " + Spoon.i);
}
}
实验结果:
i = 47
测试三:
public class Spoon
{
static int i = 1;
static
{
i = 47;
}
Spoon()
{
i = 10;
}
public static void main(String[] args)
{
Spoon spoon = new Spoon();
System.out.println("i = " + Spoon.i);
}
}
实验结果:
i = 10
从这一轮实验中,我们可以看出
1>在成员变量定义时执行的初始化和显示的初始化模块执行的初始化均早于构造函数的执行。
2>成员变量定义时执行的初始化和显示的初始化模块执行的初始化执行的顺序和代码的顺序相同。
在第二轮实验中,我们对显示静态初始化块的执行次数进行了测试。
首先,我们定义了两个类:Cup和Cups。Cup是一个基础类,它包含了一个构造函数和一个基础函数;Cups是一个稍微复杂一点的类,它包含了两个静态成员变量cup1和cup2,一个静态初始化块和一个构造函数。其具体代码如下:
class Cup
{
Cup(int maker)
{
System.out.println("Cup(" + maker + ")");
}
void f(int maker)
{
System.out.println("f(" + maker + ")");
}
}
class Cups
{
static Cup cup1 = new Cup(1);
static Cup cup2 = new Cup(2);
static
{
cup1 = new Cup(3);
cup2 = new Cup(4);
}
Cups()
{
System.out.println("Cups()");
}
}
最后,我们定义了一个ExplicitInitialization类来针对文章开始提出的两个问题进行测试,该类包含了main()函数。
测试一:
public class ExplicitInitialization
{
public static void main(String[] args)
{
System.out.println("Inside main");
}
static Cups cups1 = new Cups();
}
测试结果:
Cup(1)
Cup(2)
Cup(3)
Cup(4)
Cups()
Inside main
测试二:
public class ExplicitInitialization
{
public static void main(String[] args)
{
System.out.println("Inside main");
}
static Cups cups1 = new Cups();
static Cups cups2 = new Cups();
}
测试结果
Cup(3)
Cup(4)
Cup(1)
Cup(2)
Cups()
Cups()
Inside main
测试三:
public class ExplicitInitialization
{
public static void main(String[] args)
{
System.out.println("Inside main");
Cups.cup1.f(99);
}
static Cups cups1 = new Cups();
static Cups cups2 = new Cups();
}
实验结果:
Cup(3)
Cup(4)
Cup(1)
Cup(2)
Cups()
Cups()
Inside main
f(99)