一般情况下,如果变量被声明为final,我们就无法覆盖该变量的值,但是当我们使用字符串缓冲区时,这并不能保持良好状态。有人能让我知道为什么吗?
以下代码有效!!!!!!
public static void main(String args[]) {
final StringBuffer a=new StringBuffer("Hello");
a.append("Welcome");
System.out.println(a);
}
输出:
HelloWelcome
答案 0 :(得分:9)
来自Java Language Specification(强调我的):
一旦指定了最终变量,它总是包含相同的值。 如果最终变量包含对象的引用,则对象的状态可能会被对象上的操作更改,但变量将始终引用同一对象。
因此可以操纵a
a.append("Welcome"); //is OK
但无法将a
重新分配给其他对象
final StringBuffer a = new StringBuffer("Hello");
a = new StringBuffer("World"); //this wont compile
答案 1 :(得分:4)
对最终变量不能做的是将其更改为引用另一个对象(或原始值)或null。
在那里,你总是引用相同的对象,与字符串相反,stringbuffer不是不可变的。
你必须得到的是你的变量的值是对stringbuffer的引用,而不是该对象的实际内容。
答案 2 :(得分:0)
你应该对Mutable and Immutable objects做一些阅读。
不可变类的示例:String,Integer,Long 可变类的示例:StringBuffer,Date
在可变对象中,您可以在构造后更改状态,例如
final StringBuffer a=new StringBuffer("Hello");
a.append("Welcome");
在不可变的情况下,你不能在构造之后改变对象的状态。
答案 3 :(得分:0)
如果变量被声明为final,我们就无法覆盖该变量的值
正确。一旦分配了最终变量,就无法重新分配。编译器不允许它。
但是当我们使用字符串缓冲区时,这并不好。
是的。
以下代码有效!!!!!!
代码没有出现您描述的问题。它表明,引用最终的对象仍然可以变异。这是完全不同的事情。