`

JVM对final变量赋值的限制

 
阅读更多

       对于final变量的赋值,JVM对其是有限制的。为了保证安全性只允许其被赋值一次。

例如下面的程序就是不合法的:


虽然程序本身可能没有什么错误,但是Java的编译器认为这样是不安全的。解决办法有很多,下面给个不错的解决办法:


如上所示,不仅解决了问题(final只被赋值了一次),还增加了程序的可读性。
 
 ***********************************************************************************************************************************

 

如下代码就是合法的:



 if...else语句和try...catch语句不同。if语句中的执行之后,else中的是不可能执行的。所以,以上代码是安全的。但是try...catch语句就不同了。try中的语句执行之后,抛出异常又会执行catch语句中的。所以try...catch对final变量赋值是通不过Java编译器的。

  • 大小: 12.8 KB
分享到:
评论

相关推荐

    局部变量用final的讨论

    这是因为内部类可以访问外部类的final或effectively final变量,而这些变量被视为常量。 3. **代码优化**:JVM可能会对`final`局部变量进行优化,如逃逸分析,将它们存储在栈上而不是堆上,提高运行效率。 4. **...

    final变量.

    `final`变量确保其值在赋值后不会被修改,从而提供了数据的安全性和一致性。这在多个方面都有其优势,包括效率、设计约束以及代码优化。 1. **效率问题**: `final`关键字有时用于效率考虑,特别是当一个方法被...

    深入理解final变量的初始化

    以下是对`final`变量初始化的详细分析: 1. **定义时初始化**: `final`变量可以在定义时直接赋值,这是最常见的方式。例如: ```java final int a1 = 1; ``` 这里的`a1`在定义时就被赋予了初始值1,之后不能...

    Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释.doc

    - 对于`b`,JVM会在`Inner`类中创建一个隐式的final变量副本。 - 这个副本是`b`的精确复制,并且可以在`Inner`类的任何地方被访问。 - 由于`a`不是final变量,因此JVM不会为其创建副本,导致无法在`Inner`类中...

    Java中final的深度剖析

    在某些情况下,JVM会进行逃逸分析,如果发现final变量不会被外部访问,可能会将其优化为栈上的局部变量,从而提高性能。同时,final变量的编译时替换也有助于提高代码执行速度。 6. **final和异常处理** 在异常...

    JVM调优篇.pdf

    虚拟机会保证子方法执行之前,父类的方法已经执行完毕,如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成()方法。 类加载器 虚拟机设计团队把加载动作放到JVM外部实现,以便让应用...

    Java常见笔试、面试题目深度剖析 final详解

    1. **final变量** - `final`修饰的变量一旦赋值后,就不能再改变。这可以确保变量的值在整个程序运行期间保持不变,常用于创建常量。 - 对于基本类型,`final`变量在声明时必须初始化,或在构造器中初始化。 - ...

    深入理解Java中的final关键字_动力节点Java学院整理

    1. 提高性能:JVM 和应用程序可以对 `final` 变量进行缓存和优化。 2. 安全的多线程共享:`final` 变量在多线程环境中的共享无需额外的同步成本。 3. 代码优化:JVM 会针对 `final` 方法、变量和类进行优化。 需要...

    Java中的final关键字

    1. **final变量** - `final`修饰的局部变量一旦初始化后,就不能再改变其值。这有助于防止意外修改,增加代码的可预测性和安全性。 - 类级(静态)常量通常也用`final`修饰,例如`public static final`,这样的...

    JVM学习笔记.docx

    - 执行类构造器()方法,根据源文件中出现的顺序执行类变量赋值和静态语句块。 这些知识点构成了JVM的基础,理解它们对于优化Java程序性能、调试和解决内存问题至关重要。在实际开发中,理解JVM的工作原理有助于写...

    final关键字和static_用法

    例如,JVM可能会对`final`方法应用内联技术,从而提高执行效率。 示例代码: ```java public class Test1 { public void f1() { System.out.println("f1"); } public final void f2() { System.out.println("f2")...

    编写高质量的java代码.docx

    这是因为反序列化时 final 变量在以下情况下不会被重新赋值:通过构造函数为 final 变量赋值;通过方法返回值为 final 变量赋值;final 修饰的属性不是基本类型,从而可能会影响代码的可读性和可维护性。 14.使用...

    Java关键字final、static使用总结

    3. **final变量(常量)**:final变量一旦赋值后,其值就不能改变。它们可以是类级别的(静态变量)或对象级别的(实例变量)。final变量可以用来定义常量,如PI值或配置参数。局部变量也可以声明为final,但它们...

    static and final.

    - **最终变量**:被 `final` 修饰的变量一旦赋值后就不能改变。这适用于局部变量、实例变量和静态变量。对于引用类型的 `final` 变量,一旦赋值,就不能重新指向另一个对象,但其引用的对象内容仍然可以改变。 ####...

    JVM类加载机制1

    对于final修饰的静态变量,其值在准备阶段就会被赋值。 - 解析:将符号引用替换为直接引用,即从逻辑上的名称映射到实际地址,便于直接访问。 3. 初始化: 初始化阶段,类的静态变量和静态代码块被执行,赋予它们...

    final关键字的使用

    2. **修饰变量**:对于变量而言,`final`关键字使得该变量成为常量,即一旦给变量赋值后,其值就不能再被改变。这对于创建不可变对象非常重要,同时也可用于声明各种配置项或者常量,确保它们在整个程序运行期间保持...

    final, finally, finalize的区别

    3. **性能优化**:JVM能对 `final` 变量进行内联优化,这意味着如果一个方法被声明为 `final`,那么它不能被子类覆盖,这有助于提高代码执行效率。 4. **常量**:当用 `final` 声明一个变量并初始化后,这个变量就...

    一文读懂Jvm类加载机制

    同时,在这个阶段,JVM也会执行类中的变量赋值语句和静态语句。 在类加载机制中,还有一个非常重要的概念是类加载器。类加载器负责将.class文件加载到JVM中,并对其进行验证、准备、解析和初始化等操作。类加载器...

    java面向对象基础_final详细介绍.docx

    3. **性能优化**:JVM可能对`final`变量进行优化,如静态`final`字段可以存储在方法区,提高访问速度。 总结,`final`关键字在Java中是面向对象编程的重要组成部分,它有助于确保代码的稳定性和可预测性,防止意外...

Global site tag (gtag.js) - Google Analytics