当一个Java 类初次以(类名.成员)形式被访问到静态成员时(静态函数/静态变量),类成员的初始化顺序是:
静态(静态变量和静态代码,顺序依据他们在代码中出现的先后顺序)
当一个Java 类被实例化时,类成员的初始化顺序是:
静态变量和静态代码块(顺序依据他们在代码中出现的先后顺序)
实例变量或实例化语句(它们的顺序依据他们在代码中出现的先后顺序)
构造函数
当中main()函数中我们使用一个非静态的变量或函数时,总会遇到“Cannot make a static reference to the non-static field xxxx”,这是因为在实例化当前对象前,当前类的所有非静态变量和非静态函数都尚未初始化,我们就调用“xxxx”,显然会出错。当然,实例变量和实例方法必须由实例来调用。
执行以下类查看结果,
//: Mugs.java
class Mug {
Mug(String marker) {
System.out.println(marker);
}
}
public class Mugs {
//实例变量
Mug c3 = new Mug("实例变量c3————开始初始化");
Mug c4;
//静态变量/类变量
static Mug c1 = new Mug("静态变量c1————开始初始化");
//构造函数
Mugs() {
System.out.println("Mugs()构造函数————开始执行");
}
//实例初始化语句
{
c4 = new Mug("实例变量c4————开始初始化");
System.out.println("实例初始化语句————开始执行");
}
//static代码块
static{
System.out.println("static代码块————开始执行");
}
static Mug c2 = new Mug("静态变量c2————开始初始化");
//实例函数
public void fuction() {
System.out.println("实例函数fuction————被调用!");
}
public static void main(String[] args) {
System.out.println("进入 main()函数");
Mugs x = new Mugs();
x.fuction();
}
} // /:~
运行mugs类,可得到如下结果:
静态变量c1————开始初始化
static代码块————开始执行
实例变量c2————开始初始化
进入 main()函数
实例变量c3————开始初始化
实例变量c4————开始初始化
实例初始化语句————开始执行
Mugs()构造函数————开始执行
实例函数fuction————被调用!