前言
==
- 在java开发中我们面对经常变化的东西会在内存中开辟一块空间专门存储。对这块地址的描述我们抽象的叫做变量
- 但是同样在java中我们有的时候需要一个这样的变量:从头到尾都不会改变内容
- 这样的内容有什么好处呢?这样的变量我们可以用来做全局性的使用。作为一个默认值使用
问题描述
====
- final修饰的无法做修改,这是java对final的功能的定位
- final主要可以修饰类、方法、变量。当修饰在类上表示该类不能被集成;当修饰在方法上表示该方法不能被重写;当修饰在变量上表示不能被修改。这是上学那会背诵的内容。不会出错啊
- 但是,粗心的我又开始犯糊涂了。
- 在系统中有一个类叫做
user
。 我通过final修饰目的就是想让其内容不变做一个默认值使用
final User user = new User("hello");
- 可是当我们在程序中的某个地方获取是发现这个被final修饰的User并不一定是hello 。 有可能是别的值。
- 既然是有可能,那就说明是被别人在某处修改了。
问题分析
====
- 为了重新浮现这个问题。我将在finall修饰后直接对User对象进行修改。
public static void main(String[] args) {
final User user = new User("hello");
user.setName("zxhtom");
System.out.println(user.getName());
}
- 按照我们学习的内容,这时候我们知道应该报错。但是出乎意料的是不仅没有报错而且打印出来的内容居然是zxhtom 。
- 为什么会是这样呢?这就要追究自己的基础没有学好了
- final虽然修饰变量是变量不能改变。那是我们只学习记住了前半句话。final修饰变量准确的说是分情况的。
* final修饰基础变量则值不能被改变
* final修饰引用类型数据则其引用地址不能改变好好体会上面两句话。User就是引用类型也就是说被final修饰的user对象所指向的堆内存地址不能变 。但是这块内存里存放的东西是可以变得。
代码语言:java复制public static void main(String[] args) {
final User user = new User("hello");
User user2 = new User("zxhtom");
user = user2;
System.out.println(user.getName());
}
- 如果程序这么写的话,在编译期间就会报错。因为final修饰的user指向的地址被改成指向user2了。这就违反了java的设计原则了
总结
==
- 学习一定要脚踏实地。虽说不要咬文嚼字。但是每个特性在什么样的场景下我们还是需要分清楚的
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!