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

2022-08-31 04:44:41

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

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

如果删除关键字,则会抱怨,因为变量是 。但是,可以删除和关键字并使其编译。staticafinalfinalstatic

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


答案 1

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

类初始值设定项在加载时(实际上,当它被解析时,按其定义顺序执行(自上而下,就像简单的变量初始值设定项一样),但这是一个技术问题)。

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

如果从 中删除,它将成为一个实例变量,您无法从静态初始值设定项块访问该变量。这将无法编译,并出现错误“无法从静态上下文中引用非静态变量a”。staticint a

如果还从初始值设定项块中删除,则它将成为实例初始值设定项,因此在构造时进行初始化。staticint a


答案 2

哎呀!什么是静态初始值设定项?

静态初始值设定项是 java 类中的一个代码块,在调用构造函数或 main 方法之前仅运行一次。static {}

还行!告诉我更多...

  • 是任何 java 类中的一个代码块,在调用类时由虚拟机执行。static { ... }
  • 不支持任何语句。return
  • 不支持任何参数。
  • 否 或 受支持。thissuper

嗯,我在哪里可以使用它?

可以在任何你觉得没问题的地方使用:)就是这么简单。但是我看到大多数时候它是在进行数据库连接,API init,日志记录等时使用的。

不要只是吠叫!例子在哪里?

package com.example.learnjava;

import java.util.ArrayList;

public class Fruit {

    static {
        System.out.println("Inside Static Initializer.");

        // fruits array
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Pear");

        // print fruits
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        System.out.println("End Static Initializer.\n");
    }

    public static void main(String[] args) {
        System.out.println("Inside Main Method.");
    }
}

输出???

在静态初始值设定项内部。

苹果

结束静态初始值设定项。

内部主方法。

希望这有帮助!


推荐