Java 中的代码块

212 阅读1分钟

参考:

代码块的定义和约束:

  1. 代码块是由包含在花括号 '{}' 中的多条语句组成的;
  2. 代码块可以嵌套;
  3. 代码块中声明的变量仅能在该代码块中访问,内部代码块可以访问外部代码块声明的变量;

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