Static 修饰符和 Final 修饰符之间的区别

发布:2024-09-27 11:58 阅读:125 点赞:0

一、引言

在编程中,有时需要定义一个类成员,可以独立于该类的任何对象使用。通过在成员变量声明前加上关键字 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 类无法被继承。