Java关键字final与static深度解析
Executive Summary
核心观点(金字塔原理)
结论先行: final强调不可变性,static强调类级别共享,二者组合使用可实现高效的全局常量定义。
支撑论点:
- final修饰的变量初始化后不可修改,保证多线程安全,且编译器对final方法采用内嵌优化提高执行效率
- static变量在JVM加载类时分配内存,全局唯一拷贝,可通过类名直接访问,但不能使用this/super
- static final组合表示不可修改的类级别常量,兼具共享性和不变性
SWOT 分析
| 维度 | 分析 |
|---|---|
| S 优势 | 系统梳理了final/static的各种修饰场景及其与JVM加载机制的关系 |
| W 劣势 | 缺乏具体代码示例演示各场景下的实际表现 |
| O 机会 | 适用于面试准备、代码审查中的修饰符选择决策 |
| T 威胁 | 误用static可能导致内存泄漏,误用final可能影响代码扩展性 |
适用场景
- Java基础知识复习与面试准备
- 设计常量类、工具类时的关键字选择
- 理解JVM类加载与内存管理
final/static
- final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变。
- final 修饰成员变量时,要不初始化,要不构造方法初始化。初始化后不可修改,多线程安全,比如传参数时使用final修改,方法内不可修改该变量。效率高,编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
- static 全局或者静态,或静态代码块,独立于该类的任何对象,不依赖特定实例。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
- static 静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块。对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配
- 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!
- JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次static和”this、super”势不两立,static跟具体对象无关,而this、super正好跟具体对象有关。
- static不可以修饰局部变量。
- static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。
- static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。