Java 修饰符语法和格式

2022-09-05 00:32:16

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

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{}  

我永远不知道正确的顺序是什么,有时我会弄错,因为有很多可能的组合。有没有一个明确的指南,关于哪个应该在另一个之前?

是否有任何关于它们在代码中出现的格式和顺序的描述?我试图提出一个语法指南,但我不确定它是否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  

答案 1

从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

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


答案 2

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

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

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

这个顺序应该在Java编程几天后自然而然地浮现在你的脑海中。