Java Language Specification - Cannot understand 'BlockStatement'

Viewed 408

I've been examining the Java Language Specification here (instead I should be out having a beer) and I am curious about what a method can contain. The specification states a method body can contain a block

MethodBody:
    Block

Where a 'Block' contains 'BlockStatements'. The 'BlockStatement' rule looks like this:

BlockStatement : 
    LocalVariableDeclarationStatement
    ClassOrInterfaceDeclaration
    [Identifier :] Statement

I can understand the 'LocalVariableDeclarationStatement' which could be

[final] int x, y, z;

However, I don't get why the 'ClassOrInterfaceDeclaration' rule is there. This rule looks like:

ClassOrInterfaceDeclaration: 
    ModifiersOpt (ClassDeclaration | InterfaceDeclaration)

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

InterfaceDeclaration: 
    interface Identifier [extends TypeList] InterfaceBody

What's going on here - You can't declare a class or interface within a block surely? Can someone help elucidate this confusion please?

Update: I can define a class within a method, but the following won't work:

public class Foo {
    public void doFoo() {
        interface dooJa {
            int bar();
        }
    }
}

The compiler complains stating "The member interface dooJa can only be defined inside a top-level class or interface"... any explanations?

5 Answers
Related