【问题标题】:Facing Problem with order of execution of constructor static block and code block面临构造函数静态块和代码块的执行顺序问题
【发布时间】:2021-09-09 07:22:35
【问题描述】:

我知道,当我创建一个实例静态块时,首先初始化代码块,然后是我的代码的构造函数

public class Main{

public Main() {
    out.println("constructor initialised");
}

static {
    out.println("static block initialised");
}
{
    out.println("Code block initialised");
}

public static void main(String... args) {

    new Main();
}

}

这样输出

静态块初始化
代码块初始化
构造函数初始化

上面的输出清楚了我的概念,但是当我扩展这样的类时

public class Main extends Bear{

public Main() {
    out.println("constructor initialised");
}

static {
    out.println("static block initialised");
}
{
    out.println("Code block initialised");
}

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

熊类

class Bear{
static {
    out.println("static block initialised of bear class");
}

{
    System.out.println("Code bLock initialised of bear class");
}

void run() {
    out.println("running...");
}
}

输出如下:

熊类的静态块初始化
静态块初始化
熊类的代码块初始化
代码块初始化
构造函数初始化

当扩展类时,执行顺序发生了变化,我不明白为什么会出现上面的输出

【问题讨论】:

  • 这里是同一个问题的链接,它会很有帮助:stackoverflow.com/q/19561332/11742268>
  • 非常感谢这有助于我更清楚地理解静态关键字

标签: java inheritance constructor static polymorphism


【解决方案1】:

我相信这些工作的方式是:

  • 静态块在第一次加载类时被调用(基本上是你在项目中第一次使用类时),所以这些首先发生
  • 初始化(代码)块基本上在开始时(在调用 super() 之后)复制到每个构造函数中,因此您可以共享代码(虽然不是很好的风格)
  • 构造函数很好......构造函数......

它们以这种顺序出现的原因是因为子类依赖于存在的父类。子类不能在父类之前加载,所以调用父类的静态初始化器来加载它,然后再加载子类。

加载每个类后,它将调用构造函数(包括非静态代码块)来初始化您的对象。同样,子类依赖于父类存在并正确设置,因此首先调用基类构造函数,然后调用派生类构造函数。需要按此顺序完成,以便子类可以依赖于父类的某些参数。如果你在基类中添加了显式构造函数,你会得到如下输出:

类已加载

  • 熊类的静态块初始化
  • 静态块初始化

基类构造函数

  • 熊类初始化代码块
  • 熊类的构造函数初始化

子类构造函数

  • 代码块已初始化
  • 构造函数已初始化

如果你调用 new Main() 两次,你第一次会看到上面的输出,但第二次可能会丢失静态块,因为类已经被加载了。

【讨论】:

  • 值得注意的是,初始化块在调用 SUPER 之后被复制到构造函数中。这很重要,因为这就是为什么 Bear 的初始化块首先发生(Main 隐式调用 super 到 Bear。Bear 隐式调用 super 到 Ovject,然后运行初始化器,然后我们回到 Main(在隐式 super 调用之后)并运行它初始化块,然后返回到 Main 构造函数的其余部分)。
  • 是的,这是一个很好的观点。我很感激我可以更清楚地说明这一点。更新提到它是在 super 之后调用的
猜你喜欢
  • 1970-01-01
  • 2013-05-26
  • 2012-07-31
  • 2022-12-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多