static and final.
### Static (静态) 和 Final (最终) 在 Java 中的应用 #### Static (静态) 在 Java 编程语言中,`static` 关键字用于定义类成员(变量和方法)的访问特性,表明这些成员属于类本身而不是类的实例。具体而言: - **静态变量**:即类变量,它在内存中只有一个拷贝,被类的所有实例共享。当类被加载到 JVM 中时,静态变量就已经存在,可以被访问。 - **全局变量**:虽然 Java 没有全局变量的概念,但 `public static` 的成员变量和方法在某种程度上可以被视为全局变量和全局方法,因为它们可以在不创建类实例的情况下被任意类访问。 - **私有静态变量**:可以被类内部的静态代码块或静态方法访问,但不能被其他类通过类名直接访问。 - **静态方法**:可以直接通过类名调用,不需要创建类的实例。这意味着静态方法中不能使用 `this` 或 `super` 关键字,也不能直接访问类的非静态成员(即实例变量和实例方法),因为这些成员与特定的对象实例绑定。 - **静态代码块**:当 JVM 加载类时会被执行。静态代码块可以用来初始化静态变量等操作。如果有多个静态代码块,它们将按在类中的顺序依次执行,并且只执行一次。 #### Final (最终) `final` 关键字在 Java 中有多种用途,主要用于确保对象的状态不可改变或者防止类被继承。具体来说: - **最终类**:被 `final` 修饰的类不能被继承。这意味着此类不能有任何子类,同时此类中的所有方法也被隐式地视为 `final`。 - **最终方法**:被 `final` 修饰的方法不能被子类重写。这有助于保护方法的行为不被更改,从而提高代码的安全性和稳定性。 - **最终变量**:被 `final` 修饰的变量一旦赋值后就不能改变。这适用于局部变量、实例变量和静态变量。对于引用类型的 `final` 变量,一旦赋值,就不能重新指向另一个对象,但其引用的对象内容仍然可以改变。 #### Static 和 Final 的组合使用 当 `static` 和 `final` 一起使用时,表示创建了一个全局常量,这类变量在定义时必须赋予初始值,并且在整个程序运行过程中其值不能改变。这种做法常见于定义配置参数等不会改变的值,例如: ```java public class Constants { public static final int MAX_CONNECTIONS = 100; } ``` 这里 `MAX_CONNECTIONS` 是一个静态常量,它表示最大的连接数,可以通过 `Constants.MAX_CONNECTIONS` 直接访问。 ### 使用场景举例 1. **配置文件读取**:某些配置参数在整个应用生命周期中保持不变,可以使用 `static final` 定义并初始化这些参数。 2. **数学常量**:如 π、e 等数学常量,可以通过 `static final` 定义并提供给整个应用使用。 3. **枚举类型**:定义一组有限的固定值,例如颜色(RED、GREEN、BLUE),使用 `enum` 类型,实际上 `enum` 类型本身就是 `final` 的。 4. **工具类**:为了防止实例化工具类,通常将工具类的构造器声明为 `private` 并使用 `static` 方法来提供功能,有时候还需要将某些方法声明为 `final` 来避免被重写。 通过上述讨论可以看出,`static` 和 `final` 这两个关键字在 Java 中有着重要的作用,合理使用它们可以提高代码的质量、安全性和可维护性。