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就是限制我只能栓一个气球了。 |