java中final关键字详解及用法详解

 更新时间:2025年06月13日 08:30:45   作者:EMO的月亮与六便士  
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字,这篇文章主要介绍了java中final关键字详解及用法的相关资料,需要的朋友可以参考下

前言

在Java中,final关键字用于限制类、方法和变量的可变性,确保代码的安全性和清晰度。以下是其详细作用及使用场景:

1. final修饰类

  • 作用:被final修饰的类不能被继承,即不能有子类。
  • 使用场景
    • 防止类被扩展或修改,例如StringInteger等不可变类。
    • 确保类的行为或安全性(如工具类)。
  • 示例
    final class ImmutableClass {
        // 类内容
    }
    // 编译错误:无法继承final类
    // class SubClass extends ImmutableClass {}
    

2. final修饰方法

  • 作用:被final修饰的方法不能被子类重写(Override)
  • 使用场景
    • 确保方法逻辑在继承体系中保持不变,避免子类修改关键行为。
    • 与性能优化相关(早期Java版本可能内联final方法)。
  • 示例
    class Parent {
        final void criticalMethod() {
            System.out.println("关键方法,不可重写");
        }
    }
    
    class Child extends Parent {
        // 编译错误:无法重写final方法
        // @Override void criticalMethod() {}
    }
    

3. final修饰变量

final变量的值只能被赋值一次,之后不可修改。

3.1 成员变量(实例变量)

  • 必须初始化:可在声明时、构造方法或初始化块中赋值。
  • 线程安全:正确初始化的final变量可安全发布到其他线程(JMM保证)。
  • 示例
    class MyClass {
        final int value;
        
        MyClass(int value) {
            this.value = value; // 必须在构造方法中初始化
        }
    }
    

3.2 局部变量

  • 必须初始化:在声明时或后续代码中赋值一次。
  • 匿名内部类访问:在Java 8之前,匿名内部类只能访问final局部变量;Java 8+支持effectively final(实际不可变的变量)。
  • 示例
    void method() {
        final int localVar = 10;
        // localVar = 20; // 编译错误
    }
    

3.3 静态变量(类变量)

  • 必须初始化:在声明时或静态初始化块中赋值。
  • 常量定义:通常结合static final定义全局常量。
  • 示例
    class Constants {
        static final double PI = 3.14159;
    }
    

3.4 引用类型变量

  • 引用不可变:变量指向的对象不能改变,但对象内部状态可能可变。
  • 示例
    final StringBuilder sb = new StringBuilder("Hello");
    sb.append(" World"); // 合法,修改对象内容
    // sb = new StringBuilder(); // 编译错误:引用不可变
    

4. final修饰参数

  • 作用:方法参数被final修饰后,方法内不能修改其值。
  • 使用场景:防止参数被意外修改,提升代码可读性。
  • 示例
    void process(final int param) {
        // param = 5; // 编译错误
    }
    

5. final与性能

  • 内联优化:早期Java版本可能对final方法或变量进行内联优化,但现代JVM通常自动处理。
  • 代码清晰性final更多用于明确设计意图,而非强制优化。

6. 注意事项

  • 不可变对象 ≠ final变量final确保引用不变,但对象内容可能可变(如final List仍可增删元素)。
  • final类中的方法:隐式为final,无需显式声明。
  • 权衡使用:过度使用final可能导致代码僵化,需根据设计需求合理选择。

总结

final关键字通过限制类、方法和变量的可变性,增强代码的健壮性和可维护性。合理使用可明确设计意图,防止意外修改,适用于常量定义、不可变类设计、线程安全等场景。理解其在不同上下文中的作用,能更高效地编写可靠代码。

到此这篇关于java中final关键字详解及用法的文章就介绍到这了,更多相关java final关键字用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8中Stream的使用方式

    Java8中Stream的使用方式

    这篇文章主要介绍了Java8中Stream的使用方式,文章通过Stream的创建展开详细的介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • MyBatis-Plus 分页查询的实现示例

    MyBatis-Plus 分页查询的实现示例

    本文主要介绍了MyBatis-Plus 分页查询的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • add方法理解ArrayList的扩容机制

    add方法理解ArrayList的扩容机制

    这篇文章主要为大家介绍了add方法理解ArrayList的扩容机制示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Java设计模式之代理模式原理及实现代码分享

    Java设计模式之代理模式原理及实现代码分享

    这篇文章主要介绍了Java设计模式之代理模式原理及实现代码分享,设计代理模式的定义,静态代理,动态代理,jdk动态代理实现步骤,原理及源码等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java程序中实现调用Python脚本的方法详解

    Java程序中实现调用Python脚本的方法详解

    这篇文章主要介绍了Java程序中实现调用Python脚本的方法,结合实例形式分析了eclipse环境中使用Java调用Python脚本的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-03-03
  • JAVA注解相关知识总结

    JAVA注解相关知识总结

    这篇文章主要介绍了JAVA注解相关知识,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • java在cmd中乱码的问题解决

    java在cmd中乱码的问题解决

    本文深入探讨了在使用Java命令行cmd时可能出现的中文乱码问题,并提供了两种解决方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • 如何用java做一个word转图片的功能详解

    如何用java做一个word转图片的功能详解

    这篇文章主要给大家介绍了关于如何用java做一个word转图片的功能,通过实现Java Word转图片功能,避免PDF中间转换损耗,涵盖分页处理、字体设置、性能优化及替代方案对比,需要的朋友可以参考下
    2025-05-05
  • Ubuntu16.04 64位下JDK1.7的安装教程

    Ubuntu16.04 64位下JDK1.7的安装教程

    这篇文章主要为大家详细介绍了Ubuntu16.04 64位下JDK1.7的安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 浅谈spring ioc的注入方式及注入不同的数据类型

    浅谈spring ioc的注入方式及注入不同的数据类型

    这篇文章主要介绍了浅谈spring ioc的注入方式及注入不同的数据类型,具有一定借鉴价值,需要的朋友可以参考下
    2017-12-12

最新评论