2014-12-23 35 views
1

section 8.1.1 Class Modifiers of the Java Language Specification 8,它指出:指定多个类修饰符

ClassModifier


之一        注释公众保护私人抽象静态最终strictfp

但我设法编译如下:

public strictfp A{} 

也就是说,应该选择其中一个类别修饰符,但我可以选择多个类别修饰符。我在这里误解了规范吗?

+3

你读过三行吗? “一个类的声明可能包括类修饰符。ClassModifiers: ClassModifier ClassModifiers ClassModifier” – SMA

+0

我相信你的意思是java7,在java8它没有说明 – msrd0

+0

@ msrd0 java 8 JLS没有上面的线。请参阅[这里](http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.1.1)所以OP读SE 7的JLS并假设其为8。 – SMA

回答

6

答案是在上面的规则之前更ClassModifier:

ClassModifiers: 
    ClassModifier 
    ClassModifiers ClassModifier <<== Here 

ClassModifier: one of 
    Annotation public protected private abstract static final strictfp 

从本质上讲,规则说您可以在ClassModifiers列表中使用一个或多个ClassModifier。这种“一个或多个”迭代概念的递归定义对于BNF风格的语法描述(与提供重复特殊语法的EBNF相反)是很常见的。

+0

对不起,我需要更多的解释。如果我查看NormalClassDeclaration,则表示{ClassModifier}不是ClassModifers(即复数形式)。请解释我应该如何阅读。 –

+0

@ I.K。 '''''''表示“零次或多次重复”。这是EBNF风格。方括号'['']'表示“可选”。但奇怪的是,他们混合了这两种风格。 – dasblinkenlight

+0

谢谢。得到它了。 –