首先我们来看类的内部数据的初始化顺序:
package lab1;
class Window{
Window(int num)
{
System.out.println("Window(" + num + ")");
}
}
class House {
Window w1 = new Window(1); //当House类初始化时,按照变量的顺序依次初始化,则它是第一个被初始化
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 first {
public static void main(String[] args) {
House h = new House(); //初始化类House
//h.f();
}
}
如果我们仅仅只是初始化类House,那么输出结果为:
如果我们调用h.f(),那么结果为:
所以构造器的初始化在类的内部的变量的初始化之后,无论变量的位置是否在构造器之前还是之后。
接下来我们来看静态数据的初始化顺序:
package lab1;
class B {
B(int num) {
System.out.println("B(" + num + ")");
}
void f1(int num) {
System.out.println("f1(" + num + ")");
}
}
class Table {
static B b1 = new B(1); // 由于在main函数开始运行之前,有一个静态数据对该方法进行了初始化,所以它是第一个初始化 的
Table() { // 接着他就是第三个被初始化的
System.out.println("Table()");
b2.f1(1);
}
void f2(int num) {
System.out.println("f2(" + num + ")");
}
static B b2 = new B(2); // 接着就是它第二个初始化
}
class Cupboard {
B b3 = new B(3);
static B b4 = new B(4); // 由于是静态的,所以它在b3之前先初始化,则它是第四个被初始化的
Cupboard() { // 它是第六个被初始化的
System.out.println("Cupboard()");
b4.f1(2);
}
void f3(int num) {System.out.println("f3(" + num + ")");
}
static B b5 = new B(5); // 显然它应该是第五个被初始化的
}
public class first {
public static void main(String[] args) {
System.out.println("Creating a new Cupboard() in main");
new Cupboard();
System.out.println("Creating a new Cupboard() in main");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table(); // 由于静态数据的初始化在main函数运行之前,所以先对该方法进行初始化。
static Cupboard cupboard = new Cupboard();
}
此外我们要注意,静态的数据只会初始化一次,而非静态的数据和构造器则会初始化多次。
运行结果为: