java - 为什么静态 block 稍后执行?

标签 java static

附言:

这个问题已经编辑了几次,因为我以前的代码没有演示这个问题。有些答案可能对编辑后的问题没有完全意义

我有一个名为 Son.java 的公共(public)类

package com.t;

public class Son extends Father {

    static int i;

    static {
        System.out.println("son - static");
        i = 19;
    }

    {
        System.out.println("son - init-block"); 
    }

    public static void main(String[] args) {
        //Son s = new Son();
        int a[] = new int[2];
        System.out.println(a[5]);
    }

}

class Father {

    static {
        System.out.println("f - static");
    }
    {
        System.out.println("f - init-block");
    }
}

当我第一次运行程序时:

输出是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at com.t.Son.main(Son.java:19)
f - static
son - static

稍后当我运行这个程序时(输出顺序是随机)

输出是:

f - static
son - static
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
    at com.t.Son.main(Son.java:19)

我读到 static block 在类初始化时执行。

但是为什么这里先出现异常,然后执行静态 block 呢?

我也在使用 Eclipse 来运行我的程序。 有人可以解释一下吗?

最佳答案

异常不会先发生,您只是先看到异常的打印输出。

如果异常先发生,您将永远看不到输出的其余部分。

这是因为您在程序中同时向 System.err(来自您的异常)和 System.out 输出。这些打印到屏幕上的顺序未定义,因此您可以按不同的顺序获取它们。

关于java - 为什么静态 block 稍后执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22603062/

相关文章:

java - 更改 Google 标题在 map 上的位置

java - 多个线程将对象引用传递给静态辅助方法

c++ - 如何在 Xcode 中包含 .a 库?

c++ - 非模板类中模板方法中的dll和静态变量

java - 如何在插件操作类中获取当前文件名

java - Java 如何获取网页的全部内容?

java - super . super .func()? - Java多态性

java - JPA : Create a custom ID annotation

optimization - gcc的-static选项?

C++ 静态类成员和非默认构造函数