[英]Need clarification on final StringBuffer object
通常,如果一个变量被声明为final,我们就不能覆盖该变量的值,但是当我们使用字符串缓冲区时这并不好。 有人能让我知道为什么吗?
以下代码有效!!!!!!
public static void main(String args[]) {
final StringBuffer a=new StringBuffer("Hello");
a.append("Welcome");
System.out.println(a);
}
输出:
你好,欢迎
从Java语言规范 (强调我的):
一旦分配了最终变量,它总是包含相同的值。 如果最终变量包含对对象的引用,则可以通过对对象的操作来更改对象的状态,但该变量将始终引用同一对象。
因此可以操纵a
指向的对象状态
a.append("Welcome"); //is OK
但就是无法重新分配a
与另一个对象
final StringBuffer a = new StringBuffer("Hello");
a = new StringBuffer("World"); //this wont compile
对最终变量不能做的是将其更改为引用另一个对象(或原始值)或null。
在那里,你总是引用相同的对象,与字符串相反,stringbuffer不是不可变的。
你必须得到的是你的变量的值是对stringbuffer的引用,而不是对象的实际内容。
你应该对Mutable和Immutable对象做一些阅读。
不可变类的示例:String,Integer,Long可变类的示例:StringBuffer,Date
在可变对象中,您可以在构造后更改状态,例如
final StringBuffer a=new StringBuffer("Hello");
a.append("Welcome");
在不可变的情况下,您无法在构造后更改对象的状态。
如果变量被声明为final,我们就无法覆盖该变量的值
正确。 一旦分配了最终变量,就无法重新分配。 编译器不允许它。
但是当我们使用字符串缓冲区时,这并不好。
是的,它确实。
以下代码有效!!!!!!
代码没有显示您描述的问题。 它表明,引用最终的对象仍然可以变异。 那是完全不同的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.