Java静态初始化程序块数据类型

时间:2017-05-22 06:14:15

标签: java static

static int B,H; 
static boolean flag = true;
static {
    Scanner scan = new Scanner (System.in);
     B = scan.nextInt();
     H = scan.nextInt();
    scan.close();

并且

static int B,H; 
static boolean flag = true;
static {
    Scanner scan = new Scanner (System.in);
   int B = scan.nextInt();
   int H = scan.nextInt();
    scan.close();

为什么这两个函数的B和H输出不同?在B和H之前定义和不定义int有什么区别?

3 个答案:

答案 0 :(得分:4)

在第二种情况下,您将BH重新定义为新的局部变量。

答案 1 :(得分:4)

在你的第二个代码中,B和H是块内的局部变量 - 你根本没有分配给该字段。这与你编写方法完全一样......

暂时忘记静态初始化 - 想象一下你有这个代码:

public class Foo {
    private int value;

    public void calculateValue() {
        int value = new Random.nextInt(5);
    }

    public int getValue() {
        return value;
    }
}

现在如果你跑:

Foo foo = new Foo();
foo.computeValue();
System.out.println(foo.getValue());

...它将打印0,因为computeValue()方法只声明一个新的局部变量。

与静态初始化程序块一起发生完全相同的事情。在这个块中:

static {
    Scanner scan = new Scanner (System.in);
    int B = scan.nextInt();
    int H = scan.nextInt();
    scan.close();
}

...您宣布新的本地变量BH - 因此它们不会影响静态字段 B和{{1完全没有。

答案 2 :(得分:0)

在第二种情况下,您将引入两个局部变量。它们覆盖静态字段,仅在静态初始化程序中可用。