需要澄清最终的StringBuffer对象

时间:2013-03-21 20:11:47

标签: java final stringbuffer

一般情况下,如果变量被声明为final,我们就无法覆盖该变量的值,但是当我们使用字符串缓冲区时,这并不能保持良好状态。有人能让我知道为什么吗?

以下代码有效!!!!!!

  public static void main(String args[]) {
        final StringBuffer a=new StringBuffer("Hello");
        a.append("Welcome");
        System.out.println(a);
    }

输出:

HelloWelcome

4 个答案:

答案 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,我们就无法覆盖该变量的值

正确。一旦分配了最终变量,就无法重新分配。编译器不允许它。

  

但是当我们使用字符串缓冲区时,这并不好。

是的。

  

以下代码有效!!!!!!

代码没有出现您描述的问题。它表明,引用最终的对象仍然可以变异。这是完全不同的事情。