Java什么是双下划线符号?

时间:2011-09-14 08:22:07

标签: java syntax notation

我正在浏览网页并找到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编程多年了,我以前从未见过这种语法。它做了什么,你为什么要使用它,我在哪里可以学到更多?

8 个答案:

答案 0 :(得分:11)

这是标签。您可以将其与breakcontinue语句一起使用。没有必要使用双下划线。


更确切地说:它是标记语句JLS 14.7)的(第一部分):

Identifier : Statement

答案 1 :(得分:4)

Java中的双下划线没有语义含义(与单下划线没有任何语义含义的方式相同)。

他们可能的唯一含义取决于某些命名约定,这些约定定义了它们的用途。

您看到的代码看起来像标签使用双下划线。由于Java中不经常使用标签,所以我不会太担心它。

答案 2 :(得分:2)

这只是一个标签。你可以写bla:,但效果相同。

标签通常与goto语句一起使用,但据我所知,goto在java中是被禁止的(并且在任何其他高级语言中都非常不鼓励)。

但是,这也可以在continuebreak的循环中使用,例如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”发生冲突。

我想总的来说,双下划线是一种手动范围的形式..