Java 需要澄清最终的StringBuffer对象吗
一般来说,如果一个变量被声明为final,我们不能重写该变量的值,但当我们使用字符串缓冲区时,这个值不起作用。有人能告诉我为什么吗 下面的代码有效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
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的对象仍然可以变异。那是完全不同的事情