我正在浏览网页并找到this example。在public static void main方法中,这是我在__main:
如:
public class Klass {
public static void main(String[] args) {
// code goes here...
__main:
// and mode code here...
}
}
我尝试将其打入eclipse并使用工具提示获得一个黄色下划线,其中说“标签__main从未明确引用”。
我找不到任何online,我真的很好奇!我已经用Java编程多年了,我以前从未见过这种语法。它做了什么,你为什么要使用它,我在哪里可以学到更多?
答案 0 :(得分:11)
答案 1 :(得分:4)
Java中的双下划线没有语义含义(与单下划线没有任何语义含义的方式相同)。
他们可能的唯一含义取决于某些命名约定,这些约定定义了它们的用途。
您看到的代码看起来像标签使用双下划线。由于Java中不经常使用标签,所以我不会太担心它。
答案 2 :(得分:2)
这只是一个标签。你可以写bla:
,但效果相同。
标签通常与goto
语句一起使用,但据我所知,goto
在java中是被禁止的(并且在任何其他高级语言中都非常不鼓励)。
但是,这也可以在continue
和break
的循环中使用,例如continue someLabel;
,如果你想让continue或break引用一个外部循环,而不是你现在所在的外部循环。
答案 3 :(得分:2)
双重下划线无关紧要。你真的在询问标签。 Here is some info。基本上它们用于控制休息时间。在采访中也是一个有趣的琐事问题:以下代码是否编译?
public void doSomething(){
http://www.stackoverflow.com
}
为什么会这样,现在你知道为什么:D
答案 4 :(得分:2)
Java有标签(但没有转到)。双下划线没有意义,但它是合法的Java标识符。
来自JLS:
14.7标记语句语句可能带有标签前缀。LabeledStatement: Identifier : Statement LabeledStatementNoShortIf: Identifier : StatementNoShortIf
标识符被声明为立即标签 包含声明。
与C和C ++不同,Java编程语言没有goto语句; 标识符语句标签与break(§14.14)一起使用或继续使用 (§14.15)陈述出现在带标签的陈述中的任何地方。
标签声明声明的标签范围是声明 紧接着标签声明。
答案 5 :(得分:2)
C及其对应的 goto 语句附带一个 Label 参数。在定义的方法中,goto label;
语句将触发执行标签的例程。以下是Greg Rogers在此Post中展示的示例。
void foo()
{
if (!doA())
goto exit;
if (!doB())
goto cleanupA;
if (!doC())
goto cleanupB;
// everything succeed
return;
cleanupB:
undoB();
cleanupA:
undoA();
exit:
return;
}
goto
可以是Java中非常有效的工具,但是Java并不明确支持goto
关键字,即使关键字已被语言保留。使用 break 语句将使命令跳出标签以继续执行标签后的语句。
示例:强>
public class Klass {
public static void main(String[] args) {
// code goes here...
__main:
{
if(args.length==0)
{
break __main;
}
}
//code after label
}
}
包com.sun.org.apache.bcel.internal.generic.GOTO
,我没有亲自使用它,但我认为它可以帮助实现与Greg Rogers所示的相同的代码结构:
void foo()
{
if (!doA())
GOTO exit;
if (!doB())
GOTO cleanupA;
if (!doC())
GOTO cleanupB;
// everything succeed
return;
cleanupB:
undoB();
cleanupA:
undoA();
exit:
return;
}
void undoB(){}
void undoA(){}
boolean doC(){return false;}
boolean doA(){return false;}
boolean doB(){return false;}
答案 6 :(得分:1)
双下划线和标签倾向于在C中使用更多。也许开发人员最近一直在编写C.
BTW:标签很少用于循环,但更罕见的用途是超出范围。
scope: {
// some code
if (flag)
break scope; // no loop
// some more code
}
因为标签很少见,所以它们可能比有用更令人困惑。 ;)
答案 7 :(得分:1)
似乎没有人完全回答你的实际问题(但是“goto”答案可能就是你真正想要的)并且他们对它只是一个标识符是正确的,但不是为什么在这种情况下使用它们。
双下划线通常在系统中用于防止可能与其他标识符发生冲突...通常用于用户可以使用范围的情况。在没有下划线的情况下,您可能会被阻止在某个时刻制作“主”变量,或者可能会阻止某些系统类使用单词main。
在这种情况下,我猜测如果变量被命名为“main”,它将与定义的“public static void main”发生冲突。
我想总的来说,双下划线是一种手动范围的形式..