Java 需要澄清最终的StringBuffer对象吗

Java 需要澄清最终的StringBuffer对象吗,java,final,stringbuffer,Java,Final,Stringbuffer,一般来说,如果一个变量被声明为final,我们不能重写该变量的值,但当我们使用字符串缓冲区时,这个值不起作用。有人能告诉我为什么吗 下面的代码有效 public static void main(String args[]) { final StringBuffer a=new StringBuffer("Hello"); a.append("Welcome"); System.out.println(a); } 输出: hellow

一般来说,如果一个变量被声明为final,我们不能重写该变量的值,但当我们使用字符串缓冲区时,这个值不起作用。有人能告诉我为什么吗

下面的代码有效

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


hellowelcom

对于最终变量,您不能将其更改为引用另一个对象(或原语值)或null

在这里,您总是引用同一个对象,与字符串相反,stringbuffer不是不可变的

您必须得到的是,变量的值是对stringbuffer的引用,而不是该对象的实际内容。

来自(emphasis mine):

一旦分配了最终变量,它总是包含相同的值如果最终变量包含对对象的引用,则对象的状态可能会通过对该对象的操作而改变,但该变量将始终引用同一对象。

因此,可以操纵
a

a.append("Welcome"); //is OK
但是不能用另一个对象重新分配
a

final StringBuffer a = new StringBuffer("Hello");
a = new StringBuffer("World"); //this wont compile

你应该继续读下去

不可变类示例:String、Integer、Long 可变类示例:StringBuffer、Date

在可变对象中,您可以在其构造后更改状态,例如

final StringBuffer a=new StringBuffer("Hello");
a.append("Welcome");
在immutable中,不能在对象构造后更改其状态

如果一个变量被声明为final,我们不能重写该变量的值

对。一旦分配了最终变量,就不能重新分配它。编译器将不允许这样做

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

是的

下面的代码有效

  public static void main(String args[]) {
        final StringBuffer a=new StringBuffer("Hello");
        a.append("Welcome");
        System.out.println(a);
    }
代码没有显示您描述的问题。它表明,引用为final的对象仍然可以变异。那是完全不同的事情