代码:
class Root
{
static
{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root
{
static
{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid
{
static
{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("Java初始化顺序演示");
System.out.println("执行Leaf的构造器");
}
}
public class TestStaticInitializeBlock
{
public static void main(String[] args)
{
new Leaf();
}
}
结果:
结论:
如果定义初始化块时使用了static修饰符,则变成了静态初始化块。静态初始化块时类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行。
因此静态初始化块总是比普通初始化块先执行。
与普通初始化块类似的是,系统在类初始化阶段执行静态初始化块时,不仅会执行本类的静态初始化块,而且还会一直上溯到java.lang.Object类,先执行java.lang.Object类中的静态初始化块,然后执行其父类的静态初始化块,最后才执行该类的静态初始化块。经过这个过程,才完成了该类的初始化过程。只有当类初始化完成后,才可以在系统中使用这个类,包括访问类method、类Field,或者用这个类来创建实例。
示例:class Method1
{
static {
System.out.println("Method1静态初始化块");
}
{
System.out.println("Method1普通初始化块");
}
public Method1(){
System.out.println(" Method1无参的构造器");
}
}
class Mid extends Method1
{
static {
System.out.println("Mid静态初始化块");
}
{
System.out.println("Mid普通初始化块");
}
public Mid(){
System.out.println("Mid无参的构造器");
}
public Mid(String msg)
{
this();
System.out.println("Mid的带参构造器,其参数值为:"+msg);
}
}
public class Method2 extends Mid
{
static {
System.out.println("Method2静态初始化块");
}
{
System.out.println("Method2普通初始化块");
}
public Method2(){
super(”方法2的无参构造器");
System.out.println(" Method2无参的构造器");
}
}
public class Test
{
public static void main(String [] args)
{
new Method2();
}
}