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
关键字并进行编译。
这两种方式让我感到困惑。 我应该如何拥有一个不属于任何方法的代码部分? 如何调用它? 一般来说,这种用法的目的是什么? 或者更好的是,我可以在哪里找到关于此的文档?
带有静态修饰符的代码块表示一个类初始化程序; 没有静态修饰符,代码块就是一个实例初始化器。
当类被加载时(实际上,当它被解析,但是这是一个技术性),类初始化符按照它们被定义的顺序(从上到下,就像简单变量初始化符一样)执行。
实例初始化器按照在实例化类时定义的顺序执行,紧接在构造函数代码执行之前,立即在调用超级构造函数之后执行。
如果从int a
移除static
,它将成为一个实例变量,您无法从静态初始化程序块访问该实例变量。 这将无法编译错误“非静态变量不能从静态上下文中引用”。
如果你还从初始化块中移除static
,它将成为一个实例初始化器,所以int a
在构造时被初始化。
UFF! 什么是静态初始化器?
静态初始化器是java类中的static {}
代码块,并且在构造函数或main方法被调用之前只运行一次。
好! 告诉我更多...
static { ... }
。 并在调用类时由虚拟机执行。 return
语句。 this
或super
。 嗯我可以在哪里使用它?
可以在任何你感觉良好的地方使用:)这很简单。 但是我发现在进行数据库连接,API初始化,日志记录等时大部分时间都用到了它。
不要只吠! 示例在哪里?
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.");
}
}
输出???
内部静态初始化器。
苹果
橙子
梨
结束静态初始化器。
主要方法内。
希望这可以帮助!
static
块是一个“静态初始化器”。
它在加载类时自动调用,并且没有其他方法可以调用它(甚至不通过Reflection)。
我个人只有在编写JNI代码时才使用它:
class JNIGlue {
static {
System.loadLibrary("foo");
}
}
链接地址: http://www.djcxy.com/p/78807.html
上一篇: Static initializer in Java
下一篇: In what order do static/instance initializer blocks in Java run?