final使得被修饰的变量“不变”,但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身不变和引用所指的对象不变。

引用本身的不变:

public static void main(String[] args) {

final StringBuffer sb1 = new StringBuffer("immutable");

final StringBuffer sb2 = new StringBuffer("not immutable");

sb1 = sb2;

}

上面的代码会在编译时报错,并出现如下提示:

引用指向的对象不变:

public static void main(String[] args) {

final StringBuffer sb1 = new StringBuffer("immutable");

sb1.append("broken!");

}

上面的程序会通过编译。

可见,final 只对引用的“值”(也即他所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final 是不负责的。这很类似 == 操作符: == 操作符只负责引用的 “值”相等,至于这个地址所指向的对象内容是否相等, ==操作符是不管的。

理解 final 问题具有很重要的含义。许多程序漏洞都基于此——final 只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象的无意识的修改可能会导致另外一个使用此对象的线程奔溃。一个错误的解决方法就是在此对象新建的时候把它声明为 final ,意图使它”永远不变”。其实那是徒劳的。

final可以修饰哪些java名词_Java关键知识点 - Java final关键字到底修饰了什么?相关推荐

  1. java域的控制修饰符可分为_Java中的类和方法的修饰符

    java 中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类 ...

  2. java考题_Java考题知识点

    挑战10个最难回答的Java面试题(附答案) - 里奥ii的文章 - 知乎 https://zhuanlan.zhihu.com/p/79186037 1.java的基本编程单元是类,基本存储单元是变 ...

  3. 字体对话框java实验_Java Web安全 || Java基础 sun.misc.Unsafe

    点击上方"凌天实验室","星标或置顶公众号" 漏洞.技术还是其他,我都想第一时间和你分享 " [历史]已连载更新全部内容:[菜单栏]-[JAVA SE ...

  4. java一键_Java环境安装-Java环境一键安装下载免安装版-西西软件下载

    Java环境一键安装,一键安装包,安装Java环境,无需用户手动安装操作,非常便利,由论坛大神整合,双击运行程序可一键配置环境,可以根据需求来进行选择.本次带来Java环境一键安装工具下载,需要配置J ...

  5. 百度 java基础_java基础知识点整理

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 java基础知识点整理1.&和&&的区别? &:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true. ...

  6. java缩写_Java学习-Java缩写词的意思

    JRE :(Java Runtime Environment)Java的运行环境. JVM:(Java Virtual Machine)Java 虚拟机. JDK :在Java1.0或Java1.1中 ...

  7. java小_Java小知识点总结

    配置 数据库配置文件 我以yml为例,以后直接复制,不要在自己写了 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver ur ...

  8. crc-itu java实现_JAVA编程心得-JAVA实现CRC-CCITT(XMODEM)算法

    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定. 1 byte checksum CRC ...

  9. java基本数据_Java基本数据类型-Java基本数据类型大小-嗨客网

    Java 基本数据类型 序号 数据类型 大小/位 可表示的数据范围 默认值 1 long(长整数) 64 -9223372036854775808-9223372036854775807 0L 2 i ...

  10. java关键字的用法_JAVA总结(一)-----关键字分类及使用

    一.文章要点: 1.访问控制修饰符 修饰符英文名修饰符意译中文名private私有的public公有的protected受保护的 2.类,方法.变量修饰符 修饰符英文名修饰符意译中文名final强制禁 ...

最新文章

  1. 深入理解PHP原理之Opcodes
  2. Linux内核移植之二:Kconfig分析
  3. 你还不知道??GitHub发布了APP版!!
  4. MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全
  5. linux vi命令 置顶,[置顶] Linux vi命令 创建文件
  6. Python适合初学者入门
  7. DataWorks 数据质量V2.3版本发布
  8. 计算机专业教育经历怎么写,个人简历教育经历怎么写?
  9. C语言零碎知识点之输入字符数组
  10. 【FinE】远期、期货、互换定价
  11. JAVA 获取今天、昨天、上周等日期
  12. 严重:init datasource errorcom.mysql.jdbc.exceptions.jdb4.CommunicationsException:Communications link失败
  13. ps和php有什么关系,lr和ps有什么区别
  14. 2022年执法资格城管执法考试多选题专项训练题及答案
  15. atoi()函数用法
  16. Win10无法识别移动硬盘的解决方案
  17. 通过USB转TTL串口下载stm32程序
  18. App logcat日志分析
  19. sdjzu 1022
  20. 如何优雅地下载计算机领域英文文献--dblp的食用方法(多图警告)

热门文章

  1. 《Tableau数据可视化实战》——1.3节连接Excel文件
  2. Maven 使用远程仓库错误
  3. HDU 5586 Sum
  4. 新氧ubuntu 9.04中文定制 Release 版(推荐)
  5. 11.RabbitMQ实战 --- 提升性能,保障安全
  6. 21. yii 2 library
  7. 6. Browser 对象 - Screen 对象(2)
  8. 第6讲 Zend 整合数据库
  9. Mybatis中javaType和jdbcType对应和CRUD例子
  10. Linux 端口占用情况查看