Static 修饰符和 Final 修饰符之间的区别
一、引言
在编程中,有时需要定义一个类成员,可以独立于该类的任何对象使用。通过在成员变量声明前加上关键字 static,可以创建这样的成员。声明为 static 的成员可以在创建任何对象之前被访问。例如,main() 方法被声明为静态,以便 Java 运行时系统可以在不创建该类实例的情况下调用它。
二、static 关键字
static 关键字可以应用于变量、方法,甚至是不属于任何方法的代码块。当类的对象被声明时,不会创建 static 变量的副本。类的所有实例共享同一个 static 变量,只有一份变量的拷贝。建议通过类名来引用 static 变量。
static 方法的限制
当方法被声明为 static 时,有一些限制:
-
只能调用其他 static方法。 -
只能访问 static数据。 -
不能使用 this或super关键字。
示例代码
public class InchesToFeet {
private static final int inches = 12; // 定义一个静态常量,表示12英寸
protected InchesToFeet() { // 默认构造函数
}
public static double convert(double in) { // 静态方法用于转换
return (in / inches); // 返回转换后的值
}
static { // 静态初始化块
System.out.println("This is a static block executed first"); // 输出信息
}
public static void main(String[] args) { // 主方法
double inch = 66; // 定义66英寸
double feet = InchesToFeet.convert(inch); // 调用静态方法进行转换
System.out.println(inch + " inches = " + feet + " feet."); // 输出结果
}
}
输出
当程序加载时,所有静态语句首先运行。首先,inches 被设置为 12,然后执行静态块。convert() 方法返回传入英寸值的双精度值。main() 方法调用静态方法 convert(),并传递英寸值。
三、final 修饰符
有时,程序员需要定义一个不变的类成员。final 修饰符可以应用于类、方法和变量,使其内容无法被修改。因此,final 变量必须在声明时初始化。声明为 final 的变量不会占用每个实例的内存,类似于常量。
示例代码
final int RED = 1; // 声明红色常量
final int GREEN = 2; // 声明绿色常量
final int BLUE = 3; // 声明蓝色常量
class Box {
int height; // 定义一个实例变量高度
Box(int h) { // 构造函数
height = h; // 初始化高度
}
public static void main(String[] args) { // 主方法
final Box boxObj = new Box(25); // 创建一个 Box 对象
boxObj.height = 32; // 修改对象的高度
}
}
输出
上述代码定义了一个名为 Box 的类,具有一个表示箱子高度的实例变量。在 main 方法中,通过 new 关键字创建一个初始高度为 25 的 Box 对象。尽管 boxObj 被声明为 final,但对象的内部状态仍然可以修改。因此,代码将 boxObj 的高度更改为 32。
四、总结
static 和 final 修饰符具有不同的目的。static 修饰符用于声明类级别的变量或方法,意味着它们属于类而不是类的实例。static 变量在类的所有对象之间共享,static 方法可以在不创建类实例的情况下调用。相对而言,final 修饰符用于限制变量、方法或类的修改。final 变量只能被赋值一次,成为常量;final 方法无法被子类重写,final 类无法被继承。