Java 修饰符详解
在 Java 中,修饰符(Modifiers)用于控制类、方法、变量或其他成员的行为和访问权限。它们可以分为两类:访问修饰符和非访问修饰符。以下是 Java 修饰符的详细介绍:
1.
2.
3.
4.
5.
6.
7.
一、访问修饰符(Access Modifiers)
用于控制成员的访问范围,共有 4 种级别:
-
public- 访问权限:无限制,所有类均可访问。
- 示例:
public class MyClass { public int publicVar; public void publicMethod() { /* ... */ } }
-
protected- 访问权限:同一包内的类和所有子类(无论是否在同一包内)。
- 示例:
protected double protectedVar; protected void protectedMethod() { /* ... */ }
-
默认(无修饰符)
- 访问权限:同一包内的类可访问(也称为 “包私有”)。
- 示例:
String defaultVar; // 默认访问修饰符 void defaultMethod() { /* ... */ }
-
private- 访问权限:仅当前类可访问。
- 示例:
private int privateVar; private void privateMethod() { /* ... */ }
访问修饰符总结表:
| 修饰符 | 同一类 | 同一包 | 子类(同包) | 子类(不同包) | 其他包 |
|---|---|---|---|---|---|
public |
✅ | ✅ | ✅ | ✅ | ✅ |
protected |
✅ | ✅ | ✅ | ✅ | ❌ |
| 默认 | ✅ | ✅ | ✅ | ❌ | ❌ |
private |
✅ | ❌ | ❌ | ❌ | ❌ |
二、非访问修饰符(Non-Access Modifiers)
用于改变类、方法或变量的功能特性:
1. static
- 作用:属于类,而非实例。
- 特点:
- 静态变量(类变量):所有实例共享同一个副本。
- 静态方法:可直接通过类名调用,不能使用
this或访问非静态成员。
- 示例:
public class MyClass { static int count = 0; // 静态变量 public static void increment() { count++; // 静态方法访问静态变量 } }
2. final
- 作用:不可变。
- 应用场景:
- 变量:赋值后不可修改(常量)。
- 方法:禁止被子类重写。
- 类:禁止被继承。
- 示例:
final double PI = 3.14; // 常量 public final void show() { /* ... */ } // 不可重写的方法 public final class FinalClass { /* ... */ } // 不可继承的类
3. abstract
- 作用:声明抽象类或方法。
- 特点:
- 抽象类:不能实例化,需被继承。
- 抽象方法:只有声明,没有实现,子类必须重写。
- 示例:
public abstract class Animal { public abstract void sound(); // 抽象方法 } public class Dog extends Animal { @Override public void sound() { System.out.println("汪汪"); } }
4. synchronized
- 作用:用于方法或代码块,保证同一时间只有一个线程访问。
- 示例:
public synchronized void add(int value) { // 线程安全的方法 }
5. volatile
- 作用:确保变量在多线程中的可见性(每次读取都从主内存获取最新值)。
- 示例:
private volatile boolean running = true;
6. transient
- 作用:用于序列化时忽略某些字段。
- 示例:
private transient String password; // 序列化时会被忽略
7. native
- 作用:声明由本地代码(如 C/C++)实现的方法。
- 示例:
public native void display(); // 本地方法
三、修饰符使用规则
-
类修饰符:
- 外部类:只能用
public、默认、abstract、final。 - 内部类:可以使用所有修饰符。
- 外部类:只能用
-
方法修饰符:
- 不能同时使用
abstract和final(矛盾)。 - 不能同时使用
abstract和static(静态方法需有实现)。
- 不能同时使用
-
变量修饰符:
final变量必须显式初始化。static final常用于定义常量(如public static final int MAX = 100)。
四、示例代码
public class ModifierExample {
private static int counter = 0; // 静态私有变量
protected final String NAME; // 常量,必须在构造函数中初始化
public ModifierExample(String name) {
this.NAME = name;
}
public static void increment() {
counter++;
}
public abstract void display(); // 抽象方法(需在子类中实现)
public synchronized void update() {
// 线程安全的方法
}
}
五、总结
- 访问修饰符控制可见性,
public最开放,private最严格。 - 非访问修饰符增强功能,如
static、final、abstract等。 - 合理使用修饰符可提高代码的安全性、可维护性和性能。
掌握修饰符是 Java 编程的基础,它们在封装、继承、多态等面向对象特性中起着关键作用。
浙公网安备 33010602011771号