2013-03-13 173 views
6

为什么在Java中,变量的作用域被限制在一个switch块中,而不是case块。例如,为什么Java中的switch语句的范围有限?

// Scope limited to a switch block 
switch (number) { 
case 1: 
    String result = "..."; 
    break; 
case 2: 
    result = "..."; 
    break; 

在上面的例子中,结果只需要声明一次。如果您声明两次,则会收到Duplicate local variable消息。

我的问题是:如果程序知道你已经声明result if number = 2? (它不会落入case 1并不会声明变量...还是会吗?)

编辑:

我可能会混淆大家。我知道如何限制变量的范围,但我的问题是:Java如何知道结果已被声明,如果它不属于

+0

可能重复的[Java开关:变量声明和范围](http://stackoverflow.com/questions/10932997/java-switch-variable-declaration-and-scope) – 2013-03-13 22:15:19

+0

这是一个重复的,谢谢 - 我'将删除。编辑:不能删除 - 将标志。 – sdasdadas 2013-03-13 22:17:07

+1

编辑我的答案。您还可以通过投票关闭:-) – 2013-03-13 22:19:44

回答

6

编辑:Java使用词法范围(也称为静态范围),所以变量的范围是在编译期间确定的,并且与实际评估无关。

Java是块范围的,所以它的范围将遵守上述示例中的{}

参见JLS 6.3

局部变量声明的块中的范围(§14.4)是 其余在其中出现的声明,以开始其自己的 初始化和包括任何进一步的块的声明者在 右侧的局部变量声明语句。

+0

你称之为静态范围更通常称为词法范围。 – delnan 2013-03-14 20:28:04

+0

@delnan你是绝对正确的。编辑,谢谢。 – 2013-03-14 20:32:02

2

Java使用块范围,选择个案不是块(它们更像标签)。这工作虽然:

// Scope limited to a switch block 
switch (number) { 
case 1:{ 
    String result = "..."; 
    break; 
} 
case 2:{ 
    String result = "..."; 
    break; 
} 
+1

错过了9秒!?前进Ziyao,你赢了:) – 2013-03-13 22:13:14

+0

我欣赏你的答案,但我的主要问题是:那么,变量是如何申报的? – sdasdadas 2013-03-13 22:13:52

5

您可以通过添加大括号这样的限制范围的情况下块?为了理解答案,您需要了解编译器的工作方式。 把交换机想象成一个在每个switch语句结尾有多个“goto”语句的大块。

我不知道Java的UNROLL switch语句,但一个容易和简单的方式如何做到这一点是这样的(伪字节码):

if (number == 1) goto label1; 
    if (number == 2) goto label2; 
    goto labelEnd; 
label1: 
    String result = "..."; 
    goto labelEnd; 
label2: 
    result = "..."; 
    goto labelEnd; 
labelEnd: 
    <some code> 
2

你是什么意思怎么办:

switch (key) { 
case 1: { 
    String result = "1"; 
    return result ; 
    } 
case 2: { 
    String result = "2"; 
    return result ; 
    } 
} 
+1

OP可能的含义是:如果number等于2,并且标签2:它遇到变量结果。但是结果只是在label1之后声明的(它没有被执行),因为它直接跳转到label2(在这个例子中是atleast) – Shiva 2014-04-02 06:01:26

3

在爷爷的语言Fortran语言,有一个计算GOTO基于对expr值语句

 GOTO expr 
     ... 
    1 ... 
     ... 
    2 ... 
     ... 

,代码跳到1,2等

C'S(和Java的)switch语句是basical一个伪装的计算机GOTO。我们有一些连续的代码和一些标签,我们跳转到其中一个标签。如果没有break,我们将执行块的其余部分。

这个相当低级别的控制机制与当今程序员的直觉相反;我们会认为switch语句选择一个子句并执行该子句,就像if-elseif-elseif-...-else语句一样。

Java继承了C的开关语义,因为他们不想偏离C太多。新语言不太可能继续这个错误。

0

原因的可变范围被限制在相对于一个case块的开关块是用java通过允许秋季从一个case块到下一个即

switch (number) { 
case 1: 
    .... some code ... 
case 2: 
    .... some more code ... 

在这种情况下的情况下,如果数是1 ,情况2的情况1 &都被执行。休息的行为就像是选择的结尾,它不会结束范围。变量范围必须在选择级别

正如其他人指出,使用块来限制范围即

switch (number) { 
case 1:{ 
    String result = "..."; 
    break; 
} 
case 2:{ 
    String result = "..."; 
    break; 
} 
0

因为没有一个“case块”。

switch语句内的所有内容都位于同一个块中。你不能在同一个块中声明两次相同的变量。

如果你想要一个'case block',你必须自己编写{}