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
类无法被继承。