特殊开关盒初始化工作,但为什么?Java开关盒
我今天的java课程中出现了这段代码,甚至连教授都无法回答为什么会这样。我希望你们中的一位知道答案并能给我 有了评论的部分,它工作起来很奇怪。如果我对z=3的部分进行注释,则它不起作用。有人能解释一下吗:D? 提前谢谢特殊开关盒初始化工作,但为什么?Java开关盒,java,Java,我今天的java课程中出现了这段代码,甚至连教授都无法回答为什么会这样。我希望你们中的一位知道答案并能给我 有了评论的部分,它工作起来很奇怪。如果我对z=3的部分进行注释,则它不起作用。有人能解释一下吗:D? 提前谢谢 public static void main(String[] args) { int a = 2; switch(a) { case 1: int z=6; case
public static void main(String[] args) {
int a = 2;
switch(a) {
case 1:
int z=6;
case 2:
//z=3;
System.out.println(z);
}
开关外壳内声明的变量是局部作用域的一部分。 你应该划定范围
public static void main(String[] args) {
int a = 2;
switch(a) {
case 1: {
int z=6;
// if a was 1, case 2 would be reached too, because there is no break here
}
case 2:{
int z=3;
System.out.println(z);
}
}
如果您想使用z变量,您应该在swtich旁边声明它
通常的做法是:
public static void main(String[] args) {
int a = 2;
switch(a) {
case 1: {
int z=6;
}
break;
case 2:{
int z=3;
System.out.println(z);
}
break;
}
此代码无法编译,因为z
尚未明确分配。如果a==2
,则未为其分配任何值。因为它是一个局部变量,所以在使用之前必须对其进行明确赋值
如果您取消注释//z=3
行,它会起作用,因为z
肯定是赋值的z
在这里的作用域中,尽管它是在不同的情况下声明的,只是因为Java的作用域规则在开关情况下就是这样工作的
:
块(§14.4)中局部变量声明的范围是声明出现的块的其余部分,从其自身的初始值设定项开始,并包括局部变量声明语句右侧的任何其他声明符
块是紧跟在开关(a)之后的
{…}
。因此,您可以在int z=
之后的该块中的任何位置引用变量z
,“工作”到底意味着什么?这个代码是做什么的?您的代码没有编译,原因是:z没有被明确指定。它编译时未注释注释。z
在案例1
中声明。直到那时它才被声明。@HenryTwist当a
是2
时,值是如何分配的?变量z
将没有赋值,因此会出现错误消息。奇怪的是,您可以取消注释//z=3
,这样做有效,否则就不会。这意味着z
在案例1:
范围之外可用。
int a = 2;
switch(a) {
case 1:
int z=6;
case 2:
//z=3;
System.out.println(z);
}