繁体   English   中英

需要澄清最终的StringBuffer对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM