java的final固然是不变,但是引用却不受管制 | Java Debug 笔记

2023-11-28 15:58:28 浏览数 (1)

前言

==

  • 在java开发中我们面对经常变化的东西会在内存中开辟一块空间专门存储。对这块地址的描述我们抽象的叫做变量
  • 但是同样在java中我们有的时候需要一个这样的变量:从头到尾都不会改变内容
  • 这样的内容有什么好处呢?这样的变量我们可以用来做全局性的使用。作为一个默认值使用

问题描述

====

  • final修饰的无法做修改,这是java对final的功能的定位
  • final主要可以修饰类、方法、变量。当修饰在类上表示该类不能被集成;当修饰在方法上表示该方法不能被重写;当修饰在变量上表示不能被修改。这是上学那会背诵的内容。不会出错啊
  • 但是,粗心的我又开始犯糊涂了。
  • 在系统中有一个类叫做user 。 我通过final修饰目的就是想让其内容不变做一个默认值使用
代码语言:java复制
final User user = new User("hello");
  • 可是当我们在程序中的某个地方获取是发现这个被final修饰的User并不一定是hello 。 有可能是别的值。
  • 既然是有可能,那就说明是被别人在某处修改了。

问题分析

====

  • 为了重新浮现这个问题。我将在finall修饰后直接对User对象进行修改。
代码语言:java复制
public static void main(String[] args) {
    final User user = new User("hello");
    user.setName("zxhtom");
    System.out.println(user.getName());
}
  • 按照我们学习的内容,这时候我们知道应该报错。但是出乎意料的是不仅没有报错而且打印出来的内容居然是zxhtom 。
  • 为什么会是这样呢?这就要追究自己的基础没有学好了
  • final虽然修饰变量是变量不能改变。那是我们只学习记住了前半句话。final修饰变量准确的说是分情况的。
代码语言:txt复制
*   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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞