Java 静态和非静态初始化代码块有什么区别
我的问题是关于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
关键字,它将抱怨,因为变量a
是final
。但是,可以同时删除final
和static
关键字并进行编译。
这两种方式都使我感到困惑。我应该如何拥有不属于任何方法的代码段?如何调用它?通常,此用法的目的是什么?或者更好的是,在哪里可以找到有关此文档的文档?
回答:
带有static
修饰符的代码块表示一个类初始化程序。没有静态修饰符的代码块是实例初始化程序。
当加载类时(实际上是在解决时,这是技术性的),按定义的顺序执行类初始化器(自上而下,就像简单的变量初始化器一样)。
实例初始化程序按照实例化类时定义的顺序执行,紧接在执行构造函数代码之前,紧接在超级构造函数调用之后。
如果static
从中删除int a
,它将成为一个实例变量,你将无法从静态初始值设定项块中访问该实例变量。这将无法通过错误“无法从静态上下文引用非静态变量a”进行编译。
如果你还static
从初始化程序块中删除,那么它将成为实例初始化程序,因此int a
在构造时进行初始化。
以上是 Java 静态和非静态初始化代码块有什么区别 的全部内容, 来源链接: utcz.com/qa/427581.html