黑马程序员技术交流社区

标题: final修饰的变量什么情况下不能改变 [打印本页]

作者: 徐梦侠    时间: 2012-10-12 19:03
标题: final修饰的变量什么情况下不能改变
看见一段代码,final修饰的变量还能变,请问什么情况下不能再变了
public class HelpDemo {
public static void main(String[] args)throws Exception{
  final StringBuffer sb=new StringBuffer("first");
  System.out.println(sb);//打印结果:first
  sb.append("second");
  System.out.println(sb);//打印结果:firstsecond
}
}
作者: 杨志男    时间: 2012-10-12 19:56
final修饰对象时应该这样理解:就是它的作用是使对象的引用变量指向不变,也就是说StringBuffer sb=new StringBuffer()这个不变,而不是说引用变量的值不变。
这里你要理解对象的引用和对象的区别:
StringBuffer sb=new StringBuffer("first");
通常把这条语句的动作称之为创建一个对象并赋初值,其实,它包含了四个动作。
1)右边的“new StringBuffer”,是以StringBuffer类为模板,在堆空间里创建一个StringBuffer类对象(也简称为StringBuffer对象)。
2)末尾的()意味着,在对象创建后,立即调用StringBuffer类的构造函数,对刚生成的对象进行初始化。
3)左边的“StringBuffer sb”创建了一个StringBuffer类引用变量。所谓StringBuffer类引用,就是以后可以用来指向StringBuffer对象的对象引用。而右边括号里的"first"只是它的初始值。
4)“=”操作符使对象引用指向刚创建的那个StringBuffer对象。
我们把这句代码分开写:
StringBuffer sb;
sb=new StringBuffer("first");
效果是一样的。这样就清楚了:一句是引用变量,一句是对象
现在问:对象叫什么?答案是没有。连名字都没有,我们怎么用?用引用变量呗。
所以那,final固定的只是这个指向,而不是引用变量的值
你可以试着给sb再指向个对象,看报不报错。
对象引用和对象可以这样理解:引用是一根绳,对象是一堆气球。我可以一根绳栓一个气球,也可以栓一堆气球,而这里的final就是限制我只能栓一个气球了。
作者: 李志群    时间: 2012-10-12 21:15
final关键字的特点。
1,final是一个修饰符,既可以修饰类,又可以修饰方法,还可以修饰变量,
2,fianl修饰的类不可以被继承。
3,final修饰的方法不可以被覆盖。
4,final修饰的变量是一个常量,只能赋值一次。
        为了将固定的一些数据方便使用,会给这些数据起一个容易阅读的名称,
        为了防止名称存储的数据改变,用final修饰,
        一般为final修饰的变量名称都是大写字母组成,如果有多个单词,
        每个单词之间用下划线分割。

记住大家,在开发时,一旦程序中有出现固定的数据,一定要将其用一个容易阅读
的名称存储,并final修饰。
作者: 杨静    时间: 2012-10-12 23:12
final 使数值恒定不变(基本类型),但用于对象应用时,fianl使引用恒定不变,一旦引用被初始化指向一个对象,那么就无法把它改为指向另一个对象,然而对象自身是可以被修改的。
public class HelpDemo {
public static void main(String[] args)throws Exception{
   final StringBuffer sb=new StringBuffer("first");
   System.out.println(sb);//打印结果:first
   sb.append("second");
   System.out.println(sb);//打印结果:firstsecond
}
}
sb 指向的是一个new 出来的StringBuffer对象,而StringBuffer不同于String(对象不可变),对象是可变的,执行append方法时,是在原来的对象上增加的,引用未改变,只是改变了对象的值。






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