当一个包似乎没有做任何事情时,为什么允许使用修饰符?

我可以使用修饰符声明以下包,但它似乎对任何事情都没有任何影响:

private public protected static final package com.stackoverflow.mangodrunk // ... class Whatever { // ... } 

所以我的问题是,在包去除之前添加一个修饰符会做什么,为什么编译器会允许它?

更新 :似乎与Eclipse捆绑在一起的编译器存在问题,正如其他人提到的那样,这是使用Sun JDK的编译器错误。

他们不是。 你在用哪个编译器?

 $ javac com/stackoverflow/mangodrunk/Whatever.java com/stackoverflow/mangodrunk/Whatever.java:1: class, interface, or enum expected private public protected static final package com.stackoverflow.mangodrunk; ^ 1 error 

根据JLS, package之前唯一可以是注释。

 PackageDeclaration: Annotationsopt package PackageName ; 

但是注释看起来像这样(为简洁省略了完整的语法):

 NormalAnnotation: @ TypeName ( ElementValuePairsopt ) 

因此,您的编译器不应该允许标准访问修饰符。

资料来源: http : //java.sun.com/docs/books/jls/third_edition/html/packages.html