java中的类只加载一次,所以这里只讨论类在第一次实例化时被加载时类中各成员的加载顺序情况。
根据以下示例代码可以看出加载顺序是:(静态代码块、静态字段)>静态主方法>构造代码块>构造函数。至于静态代码块、静态字段谁先被加载,取决于它们的代码段的先后顺序。
package com.blogs;
public class RunningOrders {
public RunningOrders() {
super();
System.out.println("我是构造函数呀");
}
// 外部类非静态成员代码块
{
System.out.println("我是非静态构造代码块1");
}
public static void main(String[] args) {
System.out.println("主方法执行了");
new RunningOrders();
System.out.println("主方法执行结束");
}
// 外部类静态成员代码块
static {
System.out.println("静态代码块1");
}
// 外部类非静态成员代码块
{
System.out.println("我是非静态构造代码块2");
}
// 外部类静态成员字段
static InnerDefineTest INT2 = new InnerDefineTest() {
@Override
void say() {
}
};
// 外部类静态成员代码块
static {
System.out.println("静态代码块2");
}
}
abstract class InnerDefineTest{
abstract void say();
static {
System.out.println("静态字段被加载了");
}
}
输出结果为:
静态代码块1
静态字段被加载了
静态代码块2
主方法执行了
我是非静态构造代码块1
我是非静态构造代码块2
我是构造函数呀
主方法执行结束