StringBuilder构造函数接受一个StringBuilder对象 - 为什么?

10
StringBuilder类定义了四个构造函数,它们中没有一个接受StringBuilder,但是以下代码可以编译通过:
StringBuilder sb = new StringBuilder(new StringBuilder("Hello"));

这是否意味着编译器会将匿名的 StringBuilder 对象在内部转换为一个字符串?


2
内部的 StringBuilder 没有分配给任何变量,但在 Java 语言中,“匿名”的术语具有另一种含义。 - manfcas
@manfcas 如果您能解释一下在Java中“anonymous”具体是什么意思,例如提供Java™教程-匿名类的链接,那么这条评论会更有帮助。 - Andreas
这并不是Java术语,但“rvalue”是一个准确的描述。 - Daniel M.
2个回答

9

StringBuilderCharSequence(它实现了该接口),并且有一个以CharSequence为参数的构造函数。这就是为什么给定的代码能够编译通过的原因:

StringBuilder sb = new StringBuilder(new StringBuilder("Hello"));

这个构造函数的作用是简单地使用给定的CharSequence内容初始化新的StringBuilder。结果将与具有相同内容的实例相同。
StringBuilder sb = new StringBuilder("Hello");

如果你查看源代码(我看的是Java 8),它不调用toString()方法。它调用append(CharSequence s)方法,该方法调用包私有的append(AbstractStringBuilder asb)方法直接从内部数组中复制字符。 - Andreas
@Tunaki 真是太棒了…这个诡秘的类…现在我知道为什么 sb.append(sb) 也能工作了。非常感谢。 - Igor Soudakevitch

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接