首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造函数静态块和代码块的执行顺序问题

构造函数静态块和代码块的执行顺序问题
EN

Stack Overflow用户
提问于 2021-06-26 02:44:32
回答 1查看 150关注 0票数 3

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

代码语言:javascript
运行
复制
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();
}

}

输出像这样

静态块初始化

代码块初始化

构造函数初始化

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

代码语言:javascript
运行
复制
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();
}
}

熊类

代码语言:javascript
运行
复制
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...");
}
}

输出如下:

熊类初始化的静态块

静态块初始化

熊类初始化的代码bLock

代码块初始化

构造函数初始化

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-26 02:54:40

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

当首次加载类时(基本上是在项目中首次使用类时)调用first

  • initialized (代码)静态块,因此在开始时(在调用()之后)从本质上将(代码)块复制到每个构造函数中,这样您就可以共享代码(不是很好的样式though)
    • constructors很好……)Constructors...

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

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

类被加载。

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

基类构造函数

class

  • Constructor初始化的
  • 代码bLock熊类的初始化

子类构造函数

initialised

  • constructor初始化的
  • 代码块

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68138774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档