在 Java 中,修饰符(Modifiers)是用来修改类、方法、变量、构造器等定义的关键字。它们主要分为两大类:访问修饰符和非控制修饰符。
以下是 Java 中所有修饰符的详细分类和说明:
一、 访问修饰符 (Access Modifiers)
访问修饰符用于设置类、接口、变量、方法和构造器的访问级别(可见性)。
Java 中有 4 种访问修饰符:
public (公共的):
适用范围: 类、接口、方法、变量、构造器。
可见性: 权限最高。被 public 修饰的成员可以被任何地方的任何代码访问。
protected (受保护的):
适用范围: 方法、变量、构造器、内部类。
可见性:
可以被同一个包 (package) 中的所有类访问。
可以被不同包中的子类访问。
default (默认的/包私有的):
适用范围: 类、接口、方法、变量、构造器。
可见性: 这是不写任何访问修饰符时的默认状态。它只能被同一个包 (package) 中的类访问。
private (私有的):
适用范围: 方法、变量、构造器、内部类。
可见性: 权限最低。它只能在其所属的同一个类内部被访问。
二、 非控制修饰符 (Non-Access Modifiers)
非访问修饰符用于提供其他功能,例如实现继承、控制并发、管理内存等。
static (静态的):
适用范围:变量(类变量)、方法(类方法)、内部类、代码块。
功能:
变量/方法:使其归属于类本身,而不是类的实例(对象)。可以通过类名直接调用,无需创建对象。
代码块:静态代码块,在类加载时执行一次。
内部类:静态内部类。
final (最终的):
适用范围:类、方法、变量。
功能:
类:不能被继承(例如 String 类)。
方法:不能被子类重写 (override)。
变量:只能被赋值一次(常量)。如果是基本类型,值不能改;如果是引用类型,引用地址不能改(但对象内部的状态可以改)。
abstract (抽象的):
适用范围:类、方法。
功能:
类:抽象类。不能被实例化(不能 new),必须被子类继承。
方法:抽象方法。只有方法声明,没有方法体(以分号结尾)。包含抽象方法的类必须声明为抽象类。
synchronized (同步的):
适用范围:方法、代码块。
功能:用于多线程环境。确保同一时间只有一个线程可以执行被修饰的方法或代码块,防止并发问题。
volatile (易变的)
适用范围:变量。
功能:主要用于多线程。它保证了变量的可见性(一个线程修改了值,其他线程能立刻看到最新值)并禁止指令重排序(但不保证原子性)。
transient (短暂的):
适用范围:变量(成员变量)。
功能:在对象序列化(Serialization)时,被 transient 修饰的变量将被忽略,不会被包含在序列化的数据中。
native (本地的)
适用范围:方法。
功能:声明一个本地方法。该方法由非 Java 语言(如 C 或 C++)实现,Java 只提供一个声明(类似于抽象方法,没有方法体)。
strictfp (严格浮点,不常用):
适用范围:类、接口、方法。
功能:(Strict Floating-Point) 确保浮点数运算在所有平台上的结果都完全一致,遵循 IEEE 754 标准,防止因硬件差异导致浮点计算结果不同。
总结:修饰符的使用组合
修饰类: public, default, final, abstract, strictfp
修饰方法: public, protected, default, private, static, final, abstract, synchronized, native, strictfp
修饰变量: public, protected, default, private, static, final, volatile, transient
修饰构造器: public, protected, default, private