黑马程序员技术交流社区

标题: final修饰的是什么? [打印本页]

作者: 黑马肖凯骏    时间: 2012-3-17 00:19
标题: final修饰的是什么?
本帖最后由 黑马肖凯骏 于 2012-3-17 00:28 编辑

final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
那么到底是哪个不会发生变化呢?
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误

引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过

这个该怎么理解,我不大明白
作者: 贠(yun)靖    时间: 2012-3-17 00:50
final StringBuffer a=new StringBuffer("immutable");
StringBuffer是一个集合容器  也是一个类  你创建了集合对象  引用时a
  加上final的意思是这个a引用就永远指向这个容器所创建的这个对象了   
   er  immutable 是容器里面的对象  你在这个容器中添加对象是不会有问题的
只要你不给a重新再创建一个容器对象就不会有问题的   
   比如你有一个木桶  这个木桶就是一个容器  而你就是这个对象的引用  也就是说 你指向了木桶
    加final就是你只能有这一个木桶了   你在木桶里面添加其他东西 比如水  衣服等等 都不会有问题的  但是你如果在别的桶里装东西就不行了
因为你终生就这一个木桶了
作者: 黑马肖凯骏    时间: 2012-3-17 00:59
贠(yun)靖 发表于 2012-3-17 00:50
final StringBuffer a=new StringBuffer("immutable");
StringBuffer是一个集合容器  也是一个类  你创建 ...


好精辟,谢谢
作者: 蒙武辉    时间: 2012-3-17 01:11
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
原因是a和b是不同的地址

final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
紧紧是a这个地址不变,它指向的对象可以改变



作者: 刘雷冲    时间: 2012-3-17 12:07
final关键字
1、final的变量值不能被改变
     final的成员变量不能被改变
     final的局部变量不能被改变
2、final的方法不能被重写
3、final的类不能被继承




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2