1. 修饰符概念
Java修饰符是Java关键字的一部分。
根据修饰符本身能否控制访问权限分为访问修饰符和非访问修饰符两种。
其中访问修饰符:private,protected,public(这里不算包权限修饰符,也不提访问修饰符的范围,主要讲关键字的作用)。使用时只能在private、protected、public以及包权限修饰符中四选一。
非访问修饰符:static、final、transient、volatile、abstract、synchronized、native、strictfp、default(这里的deafult不是指缺省值,是一个真正的关键字,可以用来修饰接口中的方法)。根据实际修饰的对象可分为类修饰符、接口修饰符、变量修饰符、方法修饰符。
2. 访问修饰符规则
访问权限 | 类 | 包 | 子类 | 其他包 |
public | Y | Y | Y | Y |
protect | Y | Y | Y | N(不含子类) |
default | Y | Y | N(不含同包) | N |
private | Y | N | N | N |
3. 非访问修饰符规则
3.1 修饰外部类
public、abstract、final、strictfp可以用来修饰外部类。
其中不能同时使用abstract与final修饰外部类。abstract修饰的类不能实例化,需要被子类继承,才能实例化abstract的子类;而final修饰的类不能被继承,有冲突所以不能同时使用。
3.2 修饰内部类
private、protected、public、abstract、final、static、strictfp可以用来修饰内部类。
其中abstract与final不能同时修饰内部类,原因同外部类相同。
3.3 修饰接口
public、abstract、strictfp可以用来修饰接口。
其中使用abstract修饰接口在这里提示多余,是因为接口是本身就是一种极致的抽象类。
3.4 修饰变量
private、protected、public、static、final、transient、volatile可以用来修饰变量。
其中不能同时使用final和volatile修饰变量,因为final修饰的变量表示它是不可变的变量,而volatile修饰的变量表示它是一个易变的共享的变量。
3.5 修饰类中的方法
private、protected、public、abstract、static、final、native、synchronized、strictfp、default可以用来修饰类中的方法。
其中private与final同时使用是多余的,因为private修饰方法表示方法私有,final修饰方法表示方法是不能被重写,private方法本身就是无法被重写的。
static与final同时使用是多余的,因为static方法本质上是无法被重写的,子类的同名static方法与父类的方法没有关联,与final的语义有部分重合,但是final可以防止子类的同名的static方法。
private不能与abstract同时使用,因为private方法是私有导致abstract方法无法被实现。
static不能与abstract同时使用,因为abstract方法在当前类中无实现无法被类直接调用。
native不能与abstract同时使用,因为native是将方法交由本地操作系统实现与abstract将方法交由子类实现冲突。
synchronized不能与abstract同时使用,因为synchronized修饰实例方法时会持有this对象,而abstract方法所在类为抽象类无法被实例化,不会存在this对象。
final不能与abstract同时使用,因为final方法不能被重载导致无法abstract方法无法被实现。
strictfp不能与abstract同时使用。(原因未知,目前推测是strictfp只能修饰带有方法体的方法,即只能修饰在当前类中实现的方法,abstract方法是交由子类实现)。
native不能与strictfp同时使用。(原因未知,目前推测是strictfp只能修饰带有方法体的方法,即只能修饰在当前类中实现的方法,native方法是交由本地操作系统实现)
3.6修饰接口方法
public、abstract、static、default、strictfp修饰接口中的方法。
其中接口方法默认为public abstract,再用public abstract修饰属于多余。
其中strictfp不能单独修饰方法,原因与strictfp不能与abstract同时修饰方法相同。
其中static和default不能同时修饰方法,原因未知。