java - 静态和非静态初始化代码块有什么区别

标签 java static static-initializer

我的问题是关于 static 关键字的一种特殊用法。可以使用static关键字来覆盖类中不属于任何函数的代码块。例如下面的代码编译:

public class Test {
    private static final int a;    
    static {
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

如果您删除 static 关键字,它会发出错误消息,因为变量 afinal。但是,可以删除 finalstatic 关键字并使其编译。

这两个方面都让我感到困惑。我怎么会有一个不属于任何方法的代码部分?怎么可能调用它?一般来说,这种用法的目的是什么?或者更好的是,我在哪里可以找到有关此内容的文档?

最佳答案

带有 static 修饰符的代码块表示一个初始化器;如果没有 static 修饰符,代码块是一个实例初始值设定项。

类初始化器在类加载时(实际上是在解析时,但这是一个技术细节)按照定义的顺序执行(自上而下,就像简单的变量初始化器一样)。

实例初始值设定项按照类实例化时定义的顺序执行,紧接着执行构造函数代码之前,紧接着调用 super 构造函数之后。

如果从 int a 中删除 static,它就会变成一个实例变量,您无法从静态初始化 block 访问该变量。这将无法编译,并出现错误“无法从静态上下文引用非静态变量 a”。

如果您还从初始化程序 block 中删除 static,那么它就会成为实例初始化程序,因此 int a 在构造时被初始化。

关于java - 静态和非静态初始化代码块有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60684649/

相关文章:

java - java中不同字符的空心正方形

java - 汤姆猫8.5.X : Migrate Valve javacode from Tomcat 7

java - 静态初始化 block

java - 无法使用扫描器类从静态 block 读取输入

java - 在外部类和内部类之间,在外部类内部或外部调用 main 方法时,它们的静态初始化程序运行顺序不同

java - 获取静态初始化 block 以在不加载类的情况下在java中运行

java - 如何使用标准 Java 布局管理器更正/居中 GridLayout?

java - Maven Surefire 测试中的 ClassNotFoundExceptions

Nifi 处理器中的 Java ExceptionInInitializer 错误

java - 面对构造函数静态 block 和代码块的执行顺序问题