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有什么区别?
答案 0 :(得分:4)
在第二种情况下,您将B
和H
重新定义为新的局部变量。
答案 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();
}
...您宣布新的本地变量B
和H
- 因此它们不会影响静态字段 B
和{{1完全没有。
答案 2 :(得分:0)
在第二种情况下,您将引入两个局部变量。它们覆盖静态字段,仅在静态初始化程序中可用。