final 关键字使用场景

1. final 修饰变量

final 修饰的变量一旦赋值就不能再更改,通常用于定义常量。

java 复制代码
package com.example.demo1;

public class FinalVariableExample {
    // 静态常量,类加载时初始化
    public static final double PI = 3.14159;
    // 实例常量,对象创建时初始化
    public final int objectId;

    public FinalVariableExample(int id) {
        // 实例常量在构造方法中初始化
        this.objectId = id;
    }

    public static void main(String[] args) {
        FinalVariableExample example = new FinalVariableExample(1);
        System.out.println("PI 的值: " + PI);
        System.out.println("对象 ID: " + example.objectId);

        // 下面这行代码会报错,因为 PI 是 final 变量,不能重新赋值
        // PI = 3.14; 
    }
}

2. final 修饰方法

final 修饰的方法不能被子类重写,常用于确保方法的行为不被改变。

java 复制代码
package com.example.demo1;

class Parent {
    // final 方法,不能被重写
    public final void display() {
        System.out.println("这是父类的 final 方法");
    }
}

class Child extends Parent {
    // 下面这行代码会报错,因为不能重写父类的 final 方法
    // public void display() {
    //     System.out.println("尝试重写 final 方法");
    // }
}

public class FinalMethodExample {
    public static void main(String[] args) {
        Child child = new Child();
        child.display();
    }
}

3. final 修饰类

final 修饰的类不能被继承,常用于创建不可变类。

java 复制代码
package com.example.demo1;

// final 类,不能被继承
final class FinalClass {
    public void show() {
        System.out.println("这是 final 类的方法");
    }
}

// 下面这行代码会报错,因为不能继承 final 类
// class SubClass extends FinalClass {
// }

public class FinalClassExample {
    public static void main(String[] args) {
        FinalClass fc = new FinalClass();
        fc.show();
    }
}

4. final 修饰方法参数

final 修饰方法参数时,在方法内部不能修改该参数的值。

java 复制代码
package com.example.demo1;

public class FinalParameterExample {
    public void printValue(final int num) {
        System.out.println("传入的值: " + num);
        // 下面这行代码会报错,因为 num 是 final 参数,不能修改
        // num = 10; 
    }

    public static void main(String[] args) {
        FinalParameterExample example = new FinalParameterExample();
        example.printValue(5);
    }
}
相关推荐
w_zero_one9 分钟前
链表(2)
java·数据结构·链表
白杨尚青17 分钟前
C++入门篇(十一):string(中)——容量与增删改查:一篇吃透所有常用接口(万字详解)
java·开发语言·c++
SimonKing27 分钟前
SSE、WebSocket 连接丢 Redis 里?那可踩大坑了!
java·后端·程序员
倔强的石头10632 分钟前
【Linux指南】动静态库系列(九):动态库如何进入进程地址空间:从磁盘 .so 到共享内存映射
java·linux·服务器
TeamDev38 分钟前
JxBrowser 9.5.2 版本发布啦!
java·前端·windows·chromium·混合应用·jxbrowser·浏览器控件
鬼手点金40 分钟前
Claude Code示范案例-进阶学习路径
java·服务器·前端·学习·计算机视觉·前向传播
浪子明X41 分钟前
用 CMake Presets 固定跨平台构建:从本地开发到 CI 的依赖一致性实践
java·spring·ci/cd
苏supper1 小时前
记一次Nacos鉴权报错unknown user,403排查|SecurityProxy源码,fastjson2扩展包缺失
java·后端
\光辉岁月/1 小时前
6.mybatisplus学习-BaseMapper、Service、常用注解
java·mybatis·mybatisplus
微信开发api1 小时前
基于WTAPI构建社群运营平台:自动拉群与会话承接链路设计
java·大数据·网络·数据库·微信·自动化