首页 > Java > java教程 > Java继承中静态块和实例块的初始化顺序是什么?

Java继承中静态块和实例块的初始化顺序是什么?

Patricia Arquette
发布: 2024-11-27 07:00:14
原创
209 人浏览过

What's the Initialization Order of Static and Instance Blocks in Java Inheritance?

Java 中静态和实例块的初始化顺序

在 Java 中使用多个类时,了解静态和实例的执行顺序初始化块变得至关重要。虽然众所周知,在一个类中,这些块按照出现的顺序运行,但它们在类之间的行为仍然存在不确定性。

要演示此行为,请考虑以下代码:

package pkg;

public class LoadTest {
    public static void main(String[] args) {
        System.out.println("START");
        new Child();
        System.out.println("END");
    }
}

class Parent extends Grandparent {
    // Instance init block
    {
        System.out.println("instance - parent");
    }

    // Constructor
    public Parent() {
        System.out.println("constructor - parent");
    }

    // Static init block
    static {
        System.out.println("static - parent");
    }
}

class Grandparent {
    // Static init block
    static {
        System.out.println("static - grandparent");
    }

    // Instance init block
    {
        System.out.println("instance - grandparent");
    }

    // Constructor
    public Grandparent() {
        System.out.println("constructor - grandparent");
    }
}

class Child extends Parent {
    // Constructor
    public Child() {
        System.out.println("constructor - child");
    }

    // Static init block
    static {
        System.out.println("static - child");
    }

    // Instance init block
    {
        System.out.println("instance - child");
    }
}
登录后复制

预期,此代码的输出与静态块在实例块之前执行的假设一致:

START
static - grandparent
static - parent
static - child
instance - grandparent
constructor - grandparent
instance - parent
constructor - parent
instance - child
constructor - child
END
登录后复制

但是,仅此观察并不能澄清父类和子类之间的初始化顺序。要进一步探索这方面,请考虑将以下未使用的类添加到代码中:

class IAmAClassThatIsNeverUsed {
    // Constructor
    public IAmAClassThatIsNeverUsed() {
        System.out.println("constructor - IAACTINU");
    }

    // Instance init block
    {
        System.out.println("instance - IAACTINU");
    }

    // Static init block
    static {
        System.out.println("static - IAACTINU");
    }
}
登录后复制

值得注意的是,修改后的代码仍然产生与原始代码相同的输出。这意味着静态和实例初始化块按以下顺序执行:

  • 所有类和接口的静态初始化块都按照广度优先从上到下的顺序执行,无论它们的依赖关系如何
  • 执行完所有静态初始化块后,所有类的实例初始化块和构造函数将按照类在类中初始化的顺序执行。

此行为符合 Java 语言规范 (JLS),该规范在第 12.4 和 12.5 节中提供了详细说明。

以上是Java继承中静态块和实例块的初始化顺序是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板