首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用继承时,静态块和初始化块的执行顺序是什么?

使用继承时,静态块和初始化块的执行顺序是什么?
EN

Stack Overflow用户
提问于 2013-10-24 16:56:08
回答 11查看 88.8K关注 0票数 96

我有两个类Parent和Child

public class Parent {    
    public Parent() {
        System.out.println("Parent Constructor");
    }    
    static {
        System.out.println("Parent static block");    
    }    
    {
        System.out.println("Parent initialisation  block");
    }
}

public class Child extends Parent {    
    {
        System.out.println("Child initialisation block");
    }
    static {
        System.out.println("Child static block");
    }

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

上述代码的输出将为

Parent static block
Child static block
Parent initialization  block
Parent Constructor
Child initialization block
Child Constructor

为什么Java要按这个顺序执行代码?决定执行顺序的规则是什么?

EN

回答 11

Stack Overflow用户

发布于 2016-01-26 04:08:24

我在视觉上学习,所以这里有一个顺序的可视化表示,作为一个SSCCE

public class Example {

    static {
        step(1);
    }

    public static int step_2 = step(2);
    public int step_8 = step(8);

    public Example(int unused) {
        super();
        step(10);
    }

    {
        step(9);
    }

    // Just for demonstration purposes:
    public static int step(int step) {
        System.out.println("Step " + step);
        return step;
    }
}
public class ExampleSubclass extends Example {

    {
        step(11);
    }

    public static int step_3 = step(3);
    public int step_12 = step(12);

    static {
        step(4);
    }

    public ExampleSubclass(int unused) {
        super(step(7));
        step(13);
    }

    public static void main(String[] args) {
        step(5);
        new ExampleSubclass(step(6));
        step(14);
    }
}

这将打印:

Step 1
Step 2
Step 3
Step 4
Step 5
Step 6
Step 7
Step 8
Step 9
Step 10
Step 11
Step 12
Step 13
Step 14

请记住,static部件的顺序很重要;回顾一下Examplestatic内容和ExampleSubclass的顺序之间的区别。

还要注意,无论顺序如何,实例初始化块总是在构造函数中的super()调用之后立即执行(即使该调用是隐含的/省略的)。但是,在初始化块和字段初始化器之间,顺序确实很重要。

票数 67
EN

Stack Overflow用户

发布于 2013-10-24 16:59:40

有几条规则在起作用

  • 静态块总是在对象创建之前运行,这就是为什么你现在看到来自父静态块和子静态块
  • 的打印消息,当你调用子类(子类)的构造函数时,这个构造函数在执行它自己的构造函数之前隐式地调用super();。初始化块甚至在构造函数调用之前就开始起作用了,所以这就是为什么首先调用它。现在你的父类被创建了,程序可以继续创建子类,这个子类将经历同样的过程。

解释:

首先执行父级的

  1. 静态块,因为它是先加载的,静态块在加载类时被调用。
票数 60
EN

Stack Overflow用户

发布于 2013-10-24 17:09:45

首先只运行子类(注释extend子句)来查看简单的流。

第二个--去Static block vs. initializer block in Java?,阅读那里被接受的答案。

编辑:

静态,(非静态)初始化器和Constructor.

  • (Non静态)初始化器被复制到每个构造函数中--在顶部--
  1. 的执行方式!(因此,行3/4/5/6)
  2. Before一个类被初始化,它的直接超类必须被初始化- http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4 (因此父静态块首先出现)。
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19561332

复制
相关文章

相似问题

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