Java 修饰符类型
Java 修饰符类型
Section titled “Java 修饰符类型”修饰符 (Modifiers) 是 Java 中的关键字,你可以将它们添加到定义中 (类、方法、变量、构造函数),以改变其含义或行为。它们大致分为两类:
- 访问修饰符 (Access Modifiers): 控制可见性或可访问性级别。
- 非访问修饰符 (Non-Access Modifiers): 提供其他特性或功能。
修饰符出现在定义的其他部分之前:
// 访问修饰符:public class MyClass { ... }class PackagePrivateClass { ... } // 默认访问 (包私有)
public class AnotherClass { private String secretData; // 私有访问 protected int inheritedValue; // 保护访问 public static final double PI = 3.14159; // 公有访问
public void publicMethod() { ... } private void helperMethod() { ... } protected void subclassMethod() { ... } void packageMethod() { ... } // 默认访问 (包私有)}
// 非访问修饰符:static final double WEEKS = 9.5;abstract class Shape { ... }final class ImmutableData { ... }
public static void main(String[] args) { ... }synchronized void updateCounter() { ... }volatile boolean flag;访问控制修饰符
Section titled “访问控制修饰符”Java 提供四种访问级别:
public: 在任何地方 (任何包中) 对所有类都可见。用于旨在供一般使用的 API。protected: 在其自己的包内以及对子类 (即使它们在不同的包中) 可见。用于打算供子类扩展的成员。- 默认 (包私有 Default / Package-Private): 仅对同一包内的类可见。这是未显式使用任何修饰符 (
public、protected、private) 时的访问级别。用于包内密切相关的工具类或成员。 private: 仅在声明类本身内部可见。任何其他类都无法访问,包括子类。用于实现细节和强制封装。
访问权限总结:
| 修饰符 | 同类 | 同包 | 子类 (不同包) | 其他包 (全局) |
|---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
| 默认 | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
注意: 顶级类 (不嵌套在其他类中的类) 只能是 public 或默认 (包私有) 的。
非访问修饰符
Section titled “非访问修饰符”这些修饰符提供额外的语义:
static: * 对于变量 (字段): 创建一个类变量,由类的所有实例共享。属于类本身,而非单个对象。在加载类时初始化。 * 对于方法: 创建一个类方法。可以直接通过类名 (ClassName.staticMethod()) 调用,无需创建对象。不能直接访问实例变量或实例方法 (除非通过对象引用)。不能使用this或super。final: * 对于变量: 使变量成为常量。初始化后其值不能改变 (无论是声明时还是在构造函数/静态初始化块中)。对于引用变量,意味着引用不能改变以指向不同的对象,但对象本身可能仍然是可变的。 * 对于方法: 阻止子类重写该方法。 * 对于类: 阻止该类被子类化 (继承)。对于创建不可变类或防止扩展很有用。abstract: * 对于类: 声明一个不能直接实例化的类。它可能包含或不包含抽象方法。设计用于被子类化。 * 对于方法: 声明一个没有实现体 (没有大括号体,以分号结束) 的方法。必须在抽象类中声明。子类必须为所有继承的抽象方法提供具体实现,除非该子类也被声明为abstract。synchronized: 用于方法和代码块。确保在给定对象实例 (或静态方法的类) 上,一次只有一个线程可以执行同步方法或代码块。用于在多线程应用程序中控制对共享资源的访问。volatile: 用于变量。表示变量的值可能被不同的线程改变。保证对 volatile 变量的读写是原子性的 (对于引用类型和大多数基本类型,Java 5 之前除long和double外),并确保跨线程写入的可见性。transient: 用于实例变量。表示在对象序列化期间不应保存该变量。strictfp: (现在较少见) 用于类和方法。确保浮点计算 (float、double) 在所有平台上严格遵循 IEEE 754 标准,可能会牺牲一些性能以获得完美的重现性。从 Java 17 开始,默认浮点语义隐式地是 strict 的。
下一步是什么?
Section titled “下一步是什么?”在介绍了修饰符之后,下一章将深入探讨基本运算符 (Basic Operators),即用于在 Java 中执行算术、比较和逻辑求值等操作的符号。