JAVA初始化块 [英] JAVA initialization blocks

查看:112
本文介绍了JAVA初始化块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如一些消息来源所说,Java实例初始化块在创建实例时或在构造函数之前执行。但想象一下这种情况:

As some sources say, the Java instance initialization blocks are executed whenever instance is created or right before constructor. But imagine this case:

public class Foo {

    {
        System.out.println("Foo init");
    }

    public Foo()
    {

        {
            System.out.println("Foo constr");
        }
    }
}

public class Main extends Foo {

    {
        System.out.println("Main init");
    }

    public Main()
    {

        {
            System.out.println("Main constr");
        }
    }

    public static void main(String[] args) {
        new Main();
    }
}

输出是(如预测的那样):

And the output is (as predicted):

Foo init
Foo constr
Main init
Main constr

所以我的问题是 - 实例初始化块的正确定义是什么,因为它显然不是在构造函数之前执行,因为输出应该是

So my question is - what is right definition of instance initialization block, because it obviously isn't executed right before constructor, because output should be

Main init
Foo init
Foo constr
Main constr

因为在调用super()之前调用了Main()构造函数,而Main初始化块应该是第一个。

because Main() constructor is called before call to super() and Main initialization block should be first.

推荐答案

不。初始化块直接复制到构造函数中。显然,那里也有一个隐含的超级。所以你的例子变成了

No. The initialization blocks are copied directly into the constructor(s). Obviously there is an implicit super in there as well. So your example becomes

public class Foo {
  public Foo()
  {
    {System.out.println("Foo init");} // initializer.
    {System.out.println("Foo constr");}
  }
}

public class Main extends Foo {
  public Main()
  {  
    super(); // super constructor.
    {System.out.println("Main init");} // initializer.
    {System.out.println("Main constr");}
  }
  public static void main(String[] args) {
    new Main();
  }
}

这解释了您观察到的行为

Which explains your observed behavior of

Foo init
Foo constr
Main init
Main constr

这篇关于JAVA初始化块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆