Java语言规范 - 无法理解'BlockStatement'

Joe*_*dev 12 java language-features

我一直在研究Java语言规范在这里(而不是我应该出有啤酒),我很好奇什么样的方法可以包含.规范声明方法体可以包含块

MethodBody:
    Block
Run Code Online (Sandbox Code Playgroud)

'Block'包含'BlockStatements'的地方.'BlockStatement'规则如下所示:

BlockStatement : 
    LocalVariableDeclarationStatement
    ClassOrInterfaceDeclaration
    [Identifier :] Statement
Run Code Online (Sandbox Code Playgroud)

我可以理解'LocalVariableDeclarationStatement'

[final] int x, y, z;
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么 'ClassOrInterfaceDeclaration'规则存在.此规则如下:

ClassOrInterfaceDeclaration: 
    ModifiersOpt (ClassDeclaration | InterfaceDeclaration)

ClassDeclaration: 
    class Identifier [extends Type] [implements TypeList] ClassBody

InterfaceDeclaration: 
    interface Identifier [extends TypeList] InterfaceBody
Run Code Online (Sandbox Code Playgroud)

这里发生了什么 - 您无法确定在块内声明类或接口?有人可以帮助解释这种混乱吗?

更新:我可以在方法中定义一个类,但以下方法不起作用:

public class Foo {
    public void doFoo() {
        interface dooJa {
            int bar();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说"成员接口dooJa只能在顶级类或接口中定义"......任何解释?

San*_*rma 6

哦,是的,你可以在方法体内声明一个类.:-)

class A {

    public void doIt() {
        class B {}
        B b = new B();
        System.out.println(b.getClass());
    }

}
Run Code Online (Sandbox Code Playgroud)


Dav*_* L. 4

您已经对不再工作的界面进行了很好的观察。原因是您正在查看非常旧版本的语法。看起来已经10多岁了。看一下 Java 6 的语法(您可能正在测试它):

http://www.it.bton.ac.uk/staff/rnb/bosware/javaSyntax/rulesLinked.html#BlockStatement

你会看到块语句:

BlockStatement:LocalVariableDeclarationStatement ClassDeclaration 语句

  • 这样好多了!谢谢你。现在,啤酒在哪里:-) (2认同)