我正在尝试编译此代码
public class Foo {
static final int x = 18;
public void go(final int y){
System.out.println(x);
}
}
public class Mixed2 {
public static void main(String[] args){
Foo f = new Foo();
f.go(11);
}
}
它被编译。甚至给出结果(18) 但这不是必须的。为什么会这样? 我用这个主意 谢谢
答案 0 :(得分:0)
据我所知,您想知道为什么代码在以下情况下有效,当您预期它会抛出错误时。
在这种情况下,您不是要更改字段x
,而只是添加一个具有相同名称的新变量,以覆盖(阴影)字段x
:
public class Foo {
static final int x = 18; // field x
// This creates a new variable x which hides the field x above
public void go(final int x /* variable x */) {
System.out.println(x);
}
}
在接下来的两种情况下,您尝试更改x
,这将导致错误:
public class Foo {
static final int x = 18; // field x
// The field x is final and cannot be changed.
public void go() {
x += 1;
}
}
public class Foo {
static final int x = 18; // field x
// The variable x is final and cannot be changed.
public void go(final int x /* variable x */) {
x += 1;
}
}
旧答案:如果您尝试打印11
,则应拨打System.out.println(y)
而不是x
。
尝试使用一些Java教程,仔细查看代码和变量名称。
答案 1 :(得分:0)
事实是,你不能改变最终的值 ...但是,你没有改变任何最终数字,如果你是,你会得到编译器错误,而不是例外。< / p>
了解静态和最终之间的差异非常重要:
process()
更改为静态仍然允许您访问它,但使process()
静态并从go()
中删除静态将阻止您引用go()
,因为x
函数不知道要查找x
的{{1}}个类。go()