参考:
代码块的定义和约束:
- 代码块是由包含在花括号 '{}' 中的多条语句组成的;
- 代码块可以嵌套;
- 代码块中声明的变量仅能在该代码块中访问,内部代码块可以访问外部代码块声明的变量;
Block in method
看一个方法中代码块作用域的例子:
public class BlockExample {
private static void test() {
String outerVar = "outer block variable";
{
String innerVar = "inner block variable";
System.out.println("from inner block: " + outerVar);
System.out.println("from inner block: " + innerVar);
}
System.out.println("from outer block: " + outerVar);
// System.out.println("from outer block" + innerVar); 无法访问内部代码块的变量 innerVar
}
public static void main(String[] args) {
test();
}
}
执行结果
from inner block: outer block variable
from inner block: inner block variable
from outer block: outer block variable
Block in class
类定义中的代码块没有数量限制,Java 会确保按照它们声明的顺序执行。
static block
类定义中以 static 为前缀的代码块,可以访问静态变量,仅在第一次加载类时执行一次。
instance block
类定义中的普通代码块,可以访问实例变量,每次执行构造函数时都会先执行 instance block 的代码,再执行构造函数本身。
看一个例子:
public class Block {
public static void main(String[] args) {
System.out.println("create person one");
new Person().show();
System.out.println();
System.out.println("create person two");
new Person().show();
}
}
class Person {
private static String STATIC_VAR;
static {
System.out.println("static block run");
STATIC_VAR = "static variable";
}
private String instanceVar;
{
System.out.println("instance block run");
instanceVar = "instance variable";
}
public Person() {
System.out.println("constructor run");
}
public void show() {
System.out.printf("show static variable: %s, instance variable: %s\n", STATIC_VAR, instanceVar);
}
}
执行结果
create person one
static block run
instance block run
constructor run
show static variable: static variable, instance variable: instance variable
create person two
instance block run
constructor run
show static variable: static variable, instance variable: instance variable