Java修饰符的语法和格式

zig*_*ggy 12 java syntax coding-style

我发现自己对访问顺序和非访问修饰符感到困惑.例如

abstract void go()  
abstract public void go()  
public final void go()  
void final go()  

final class Test{}  
class final Test{}  
final abstract class Test{}  
abstract final Test{}  
Run Code Online (Sandbox Code Playgroud)

我永远不知道正确的顺序是什么,有时候我弄错了,因为有太多可能的组合.对于哪一个应该先于另一个有明确的指导?

是否有任何关于它们在代码中出现的格式和顺序的描述?我想提出一个语法指南,但我不确定它是否100%正确.这里是:

Methods:  
[access modifier | nonaccess modifier] return-type method-name  

Classes:  
[access modifier | nonaccess modifier] class class-name  

Interfaces:  
[access modifier | nonaccess modifier] interface interface-name       

Variables:  
[access modifier | nonaccess modifier] variable-type variale-name  
Run Code Online (Sandbox Code Playgroud)

Joã*_*lva 18

从Java编程语言的官方语法(简化):

Modifier:
  Annotation | public | protected | private
  static | abstract | final | native | synchronized
  transient | volatile | strictfp

ClassOrInterfaceDeclaration:
        {Modifier} (ClassDeclaration | InterfaceDeclaration)

ClassBodyDeclaration:
        {Modifier} MethodOrFieldDecl

MethodOrFieldDecl:
        Type Identifier MethodOrFieldRest
Run Code Online (Sandbox Code Playgroud)

因此,对于类和接口,修饰符必须始终出现在class关键字之前,并且可以按任何顺序出现.例如,final public class有效,但class final不是.对于方法和字段,它是相同的,但修饰符必须出现在类型之前.

  • 注意:修饰符的任何顺序都是**有效**,但如果项目中的所有代码都使用一致的顺序,那么人们阅读代码会更容易.因此,有一个*习惯*顺序[(见Java规范8.3.1末尾的小字句)](http://docs.oracle.com/javase/specs/jls/se7/html/jls -8.html#jls-8.3.1)已被广泛采用,[例如由Google](https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.7-modifiers); 许多java工具鼓励这种排序. (4认同)
  • 请注意,Java 8将"default"添加到接口方法声明:http://docs.oracle.com/javase/specs/jls/se8/html/jls-19.html#jls-19-9其中的顺序是语法来自`public`和`abstract`. (2认同)

JB *_*zet 12

请参见http://checkstyle.sourceforge.net/config_modifier.html.

正确(或更确切地说,传统)的顺序是:

  1. 上市
  2. 保护
  3. 私人的
  4. 抽象
  5. 静态的
  6. 最后
  7. 短暂的
  8. 挥发物
  9. 同步
  10. 本地人
  11. strictfp

经过几天Java编程后,这个顺序应该会自然而然地出现在您的脑海中.