软件构造之final关键字

本文解释了Java中final关键字的作用,区分了final修饰的可变和不可变变量,指出final仅限制变量与内存空间的绑定,而不影响可变变量的值修改。同时介绍了Java常量池与不可变变量值的固定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中,final关键字用于声明不可变的实体,可以用于变量、方法和类。

介绍

一般变量与其值的内存空间之间就像是用绳索连接一样,可以被套到其他位置的内存空间。而final变量与其值的内存空间之间则是用镣铐连接,二者永远拴在一起,无法分离。

我们常常有一个误区,即用final修饰的变量其值是永远无法改变的。但如果理解了final的形象含义,就会发现我们犯了逻辑错误:final的定义只是说某一变量与某段内存空间的连接是无法改变的,但并没有提及内存空间的值是否可以改变。

那么,为了考察final变量引用的内存空间的值是否能够改变,我们分为两种情况:

  1. final修饰的可变变量
  2. final修饰的不可变变量

final修饰的可变变量

可变变量值的改变本身就是修改它指向的内存空间的值,是否被final修饰并不影响其值的修改,因此,final修饰的可变变量,其值是可以改变的。举例如下:(StringBuiler为mutable可变变量)

public static void main(String[] args){
        final StringBuilder sb = new StringBuilder("ab");
        System.out.println(sb);
        sb.append("c");
        System.out.println(sb);
    }

final修饰的不可变变量

不可变变量值的改变对应的底层原因是变量指向了另一段内存空间,而final的修饰阻止了这种情况的存在,那我们能不能通过一定手段改变此变量指向的内存空间的值呢?答案是绝对否定的!不变对象一旦被创建,其指向的值不能被修改!因为指向的值是常量,无法被修改。(详情看下面科普)注意,这一特性是不可变变量本身的性质,与是否被final修饰无关。因此,final修饰的不可变变量,其值是不可以改变的。

科普

在Java中,常量通常存储在常量池中。常量池是Java虚拟机中的一块特殊内存区域,用于存储编译时期确定的各种字面量常量,比如字符串常量、基本类型常量等。这些常量在编译阶段就已经确定,并且它们在整个程序运行期间保持不变。常量池的设计旨在节省内存空间,提高运行效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值