当某个对象的修饰符满足了上述的所有条件,那这些修饰符就可以合法存在并对这个对象起作用。不过之于多个修饰在申明顺序,Java编译器并没用做强制的规定。
比如想要定义一个公开的不加入到序列化的静态常量,下边在制定类中的定义方式都是有效的(即使说static和transient放在一起一般没什么意义):
public static final transient int zero = 0;
static transient public final int one = 1;
final public transient static int two = 2;
transient final static public int three = 3;
但为了保持编写风格的一致性,以及代码的可读性,对于修饰符的申明顺序还是有要求的。其实前面Modifier提供的修饰符汇总方法就可以反映出修饰符的申明顺序。另外,在Java Language Specification的Classes一章里也对类修饰符、方法修饰符、字段修饰符的罗列顺序也就是通常申明时要遵循的顺序。
归总如下(这里将注解也包括进来)就是:
Annotation
public
protected
private
static
abstract
final
native
synchronized
transient
volatile
strictfp
这个顺序也不用记忆,虽然编译器不会对它们进行约束,但有很多Checkstyle工具都会帮助开发者设定代码风格限定条件,并对不符合条件的写法抛出错误指示。