对于静态变量、静态初始化块、变量、初始化块、构造器的初始化顺序,为,((父类)静态变量、静态初始化块(排序按先后次序))>((子类)静态变量、静态初始化块(排序按先后次序))>((父类)变量、初始化块(排序按先后次序))>(父类)构造器>((子类)变量、初始化块(排序按先后次序))>(子类)构造器。
先来举例说说:
class Test
{
static
{
System.out.println("父类static 块 1 执行");
}
static Sample staticSam1 = new Sample("父类 静态成员staticSam1初始化");
Sample sam1 = new Sample("父类 sam1成员初始化");
static Sample staticSam2 = new Sample("父类 静态成员staticSam2初始化");
static
{
System.out.println("父类 static 块 2 执行");
}
{
System.out.println("父类的普通初始化块执行");
}
Test()
{
System.out.println("父类 Test默认构造函数被调用");
}
Sample sam2 = new Sample("父类 sam2成员初始化");
}
class TestSub extends Test
{
static Sample staticSamSub = new Sample("子类 静态成员staticSamSub初始化");
TestSub()
{
System.out.println("子类 TestSub 默认构造函数被调用");
}
Sample sam1 = new Sample("子类 sam1成员初始化");
static Sample staticSamSub1 = new Sample("子类 静态成员staticSamSub1初始化");
static
{
System.out.println("子类 static 块 执行");
}
{
System.out.println("子类的普通初始化块执行");
}
Sample sam2 = new Sample("子类 sam2成员初始化");
}
public class Init1
{
public static void main(String[] args)
{
new TestSub();
}
}
执行结果为:
父类static 块 1 执行
父类 静态成员staticSam1初始化
父类 静态成员staticSam2初始化
父类 static 块 2 执行
子类 静态成员staticSamSub初始化
子类 静态成员staticSamSub1初始化
子类 static 块 执行
父类 sam1成员初始化
父类的普通初始化块执行
父类 sam2成员初始化
父类 Test默认构造函数被调用
子类 sam1成员初始化
子类的普通初始化块执行
子类 sam2成员初始化
子类 TestSub 默认构造函数被调用