java学习--final

在 Java 中,final 是一个关键字,可以修饰类、方法、变量(包括局部变量、成员变量、静态变量),不同修饰场景下含义不同,核心是体现 "不可变" 或 "不可继承 / 重写" 的特性。

1. 修饰类

  • 含义 :被final修饰的类不能被继承,即无法派生子类。

  • 用途 :通常用于设计不可变的类(如String、Integer等包装类),保证类的安全性和稳定性。

  • 示例 :

    复制代码
    final class FinalClass {
        // 该类无法被继承
    }
    
    // 错误!无法继承final类
    // class SubClass extends FinalClass {}

2. 修饰方法

  • 含义 :被final修饰的方法不能被子类重写(override),但可以被重载(overload)。

  • 用途:防止子类修改父类方法的逻辑,保证方法行为的一致性。

  • 示例 :

    复制代码
    class Parent {
        public final void finalMethod() {
            System.out.println("父类final方法");
        }
    }
    
    class Child extends Parent {
        // 错误!无法重写final方法
        // @Override
        // public void finalMethod() {}
    
        // 允许重载
        public void finalMethod(int a) {
            System.out.println("重载final方法");
        }
    }

3. 修饰变量

final修饰变量时,变量成为常量 ,需遵循 "声明时初始化" 或 "构造器 / 代码块中初始化" 的规则,且初始化后值不可修改。

(1)修饰局部变量
  • 局部变量被final修饰后,必须在使用前初始化,且值不可变。

  • 示例:

    复制代码
    public void testLocalFinal() {
        final int a; // 声明
        a = 10;      // 初始化(只能赋值一次)
        // a = 20;  // 错误!final变量不可重新赋值
    
        final int b = 20; // 声明时直接初始化
    }
(2)修饰成员变量(实例变量)
  • 成员变量被final修饰后,必须在声明时、实例初始化块中或构造器中初始化(三者选其一),且每个实例的该变量值固定。

  • 示例:

    复制代码
    class FinalVarDemo {
        // 方式1:声明时初始化
        final int num1 = 10;
    
        // 方式2:实例初始化块中初始化
        final int num2;
        {
            num2 = 20;
        }
    
        // 方式3:构造器中初始化
        final int num3;
        public FinalVarDemo() {
            num3 = 30;
        }
    }
(3)修饰静态变量(类变量)
  • 静态变量被final修饰后,必须在声明时或静态初始化块中初始化(不能在构造器中),且属于类的常量,全局唯一。

  • 通常命名规范为全大写,单词间用下划线分隔(如PI)。

  • 示例:

    复制代码
    class FinalStaticDemo {
        // 方式1:声明时初始化
        public static final double PI = 3.1415926;
    
        // 方式2:静态初始化块中初始化
        public static final int MAX_SIZE;
        static {
            MAX_SIZE = 100;
        }
    }

4. 修饰引用类型变量

  • final修饰引用类型变量时,引用本身不可变(即不能指向新的对象),但对象的内容可以修改。

  • 示例:

    复制代码
    final List<String> list = new ArrayList<>();
    list.add("Java"); // 允许修改对象内容
    // list = new LinkedList<>(); // 错误!引用不可指向新对象

总结

修饰目标 特性
类 不可继承
方法 不可重写(可重载)
变量 不可重新赋值(引用类型变量的对象内容可修改)

final关键字的核心作用是保证不可变性,常用于定义常量、防止类 / 方法被篡改,提升代码的安全性和可读性。

相关推荐
m0_380743876 分钟前
Qt实现调用相机进行拍照并进行图像处理
开发语言·c++
wangqiaowq13 分钟前
AST 安全求值
java·开发语言
我们从未走散19 分钟前
AI 生图平台如何避免资损:用“扣款与凭据同事务”构建三态账本
开发语言·数据库·php
weixin_440730501 小时前
字符编码笔记-utf-8 、unicode、gbk,ascii编码格式
开发语言·笔记
Java_2017_csdn1 小时前
OFC、ERP、OMS、WMS、TMS 对比-详解
java
励志不掉头发的内向程序员2 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构
PHP实战开发录2 小时前
PHP接口大整数为什么变了
开发语言·php
临床数据科学和人工智能兴趣组5 小时前
在R语言中, 使用 as.factor() 函数转换数值型变量
开发语言·r语言
m4Rk_8 小时前
【论文阅读】Agent 记忆机制(83):Inside Out——用可演化 PersonaTree 构建 Agent 的核心长期记忆
论文阅读·人工智能·学习·开源·github
andyweike9 小时前
php笔记
开发语言·笔记·php