在java编程语言里,修饰符是出现在类的定义、属性、方法、构造器、初始化块等定义时的修饰。修饰符有分为访问修饰符和可选修饰符,他们基本都是关键字,有一个例外,就是访问修饰符除了public/protected/private之外还有一个默认访问修饰符,共4种。而可选修饰符则有abstract/const/default/final/native/static/strictfp/synchronized/transient/volatile。
修饰符 |
修饰场景 |
||||
类 |
成员方法 |
构造方法 |
成员变量 |
局部变量 |
|
abstract(抽象的) |
√ |
√ |
- |
- |
- |
static (静态的) |
- |
√ |
- |
√ |
- |
public(公共的) |
√ |
√ |
√ |
√ |
- |
protected(受保护的) |
- |
√ |
√ |
√ |
- |
private(私有的) |
- |
√ |
√ |
√ |
- |
synchronized(同步的) |
- |
√ |
- |
- |
- |
native(本地的) |
- |
√ |
- |
- |
- |
transient(暂时的) |
- |
- |
- |
√ |
- |
volatile(易失的) |
- |
- |
- |
√ |
- |
final(不要改变的) |
√ |
√ |
- |
√ |
√ |
无访问修饰符(默认,同包访问) |
√ |
√ |
√ |
√ |
- |
由上表可以明显地看出各修饰符可出现的位置。
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。java中保留了此关键字,但是编者并没有发现它在java中的用法。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
下面将按位置,对修饰符进行分析:
1.类
类一般情况下只有public/abstract/final和默认修饰符是被允许的,但是有一个例外,那就是在内部类中,是允许static修饰的。
public:表示该类可以被任意位置的类访问,默认(不写)表示该类被同包中的其他类访问。
abstract:表明该类为抽象类,不能被实例化。应注意类为abstract修饰时,不要求其中有抽象abstract方法,而类中有抽象方法时,该类就必须成为抽象类。
final:表明该类为最终类,不能被继承(扩展)。应注意类为final修饰时,依然可以继承其他类和实现接口。
static:外部类是不允许static修饰的,但是内部类却允许:class Outter{ static class Inner{} } 此时 可以直接通过外部类的类名产生一个内部类的实例:new Outter.Inner(); 而不需要先产生一个外部类的实例 class Outter{ class Inner{} },
Outter outter = new Outter();
outter.new Inner();
当内部类不是static时,只能通过外部类的实例产生内部类对象。
2.成员变量
一个类的成员变量的声明必须在类体中,而不能在方法中,方法中声明的是局部变量。
访问修饰符可以是4种中的任意一种。
static:类变量:一个类所拥有的变量,该类型的变量与类的实例对象无关,不管类创建了多少对象,系统仅在第一次调用类的时候为类变量分配内存,所有对象共享该类的类变量,因此可以通过类本身(类名)或者某个对象来访问类变量。
final:常量。成员变量定义时一般可以不初始化(给变量赋初值),但是final修饰成员变量时,必须在定义时就初始化,如: final int age = 20;这里的“=20”不能不写,否则编译就会报错。
volatile:声明一个可能同时被并存运行的几个线程所控制和修改的变量。
transient:声明一个该值不能被序列化的变量(对象被序列化后,该变量仍然存在,值以该类型的默认值来保存,如整型为0,String类型为null,boolean类型为false)。
3.方法
访问修饰符可以是4种中的任意一种。
abstract:抽象方法:只有声明部分,方法体为空,具体在子类中完成。
static:类方法、静态方法:
1) 调用时,可以直接使用类名调用,也可以类的某个实例对象名调用
2)不能被单独对象拥有,属于整个类共享。
3) 不能处理非static修饰的成员变量。
final:最终方法,不能被子类重写的方法。
native:本地方法,表示用其他语言书写的特殊方法,包括C,C++,FORTRAN,汇编语言等。
synchronized:多线程调用时同步,当此方法被调用时,其他线程不能够调用该方法,直到该方法返回,用于避免在多线程操作时,数据的结果出现不一致。
4.局部变量
只能有final修饰,不能够有访问修饰符修饰。
5.接口
接口的访问修饰符只能有public/默认不写(同包) 两种,其可选修饰符只能为abstract(abstract也可以不写,接口默认即为抽象)。
接口中的变量只能为 public static final 联合修饰的公共静态常量(这三个修饰符可以不写,接口中变量为默认有这三个修饰符,此外 final 类型的变量必须 在定义时初始化(赋初值),这点在上文的【变量】中已经说过 )
接口中的方法访问修饰符只能为public,一般情况下可选修饰符为abstract,即接口中的方法为默认抽象方法,不能有方法体。
此外,还可以有strictfp/static/default修饰(其中static和default只能二者选其一,strictfp必须与static和default中的一个配合使用)
static:静态方法 必须有方法体。
default:修饰的方法 必须有方法体。
strictfp:strict floatpoint 精确浮点
注意:类与接口的关系为多实现,当类实现的多个中有同名、同参、同返回类型的 抽象方法或者default方法时(包括两个都为抽象、两个都为default 和 一个为抽象一个为default ),实现类必须重写该方法。
而接口中的方法为静态(static)方法时,可以直接用接口名调用该方法,与实现类无关。实现类可以有与之相同的静态或非静态方法。
6.构造方法
构造方法前不能有返回类型,但是有一个例外:可以有一个void返回类型,一般默认不写,但是写上这个void(无返回值)修饰也不会有错。