java学习--final

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

1. 修饰类

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

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

  • 示例

    复制代码
    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关键字的核心作用是保证不可变性,常用于定义常量、防止类 / 方法被篡改,提升代码的安全性和可读性。

相关推荐
开源之眼5 分钟前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori3161 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户908324602731 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋2 小时前
DecimalFormat 与 BigDecimal
java·后端
beata2 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端
IT探险家2 小时前
你的第一个 Java 程序就翻车?HelloWorld 的 8 个隐藏陷阱
java
随风飘的云2 小时前
SpringBoot 的自动配置原理
java
SimonKing2 小时前
觅得又一款轻量级数据库管理工具:GoNavi
java·后端·程序员
Seven973 小时前
BIO详解:解锁阻塞IO的使用方式
java
oak隔壁找我13 小时前
JVM常用调优参数
java·后端