我的问题是关于静态关键字的一种特定用法。可以使用关键字来覆盖不属于任何函数的类中的代码块。例如,以下代码编译: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 修饰符,代码块就是实例初始值设定项。
类初始值设定项在加载类时(实际上,当它被解析时,但这是一个技术问题)按照它们定义的顺序(自上而下,就像简单的变量初始值设定项一样)执行。
实例初始值设定项按实例化类时定义的顺序执行,紧接在执行构造函数代码之前,紧接在调用超级构造函数之后。
如果从 中删除,它将成为实例变量,您无法从静态初始值设定项块访问该变量。这将无法编译,并显示错误“非静态变量 a 无法从静态上下文引用”。static
int a
如果还从初始值设定项块中删除,则它将成为实例初始值设定项,因此在构造时初始化。static
int a
哎呀!什么是静态初始值设定项?
静态初始值设定项是 java 类中的一个代码块,在调用构造函数或 main 方法之前只运行一次。static {}
还行!告诉我更多…
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
它在加载类时自动调用,并且没有其他方法可以调用它(甚至不能通过反射)。
我个人只在编写 JNI 代码时使用过它:
class JNIGlue {
static {
System.loadLibrary("foo");
}
}
模板简介:该模板名称为【Java 静态和非静态初始化代码块有什么区别】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。