在下面的代码中,只有一个StringBuilder实例,test2和test3实际上指向new StringBuilder()
的原始实例
StringBuilder test = new StringBuilder("test");
StringBuilder test2;
StringBuilder test3;
test2 = test;
test3 = test2;
所以我可以附加test3,它会附加原始测试。
我理解String是不可变的,但请使用下面的代码
String test = new String("test");
String test2;
String test3;
test2=test;
test3=test2;
使用相同的逻辑推理它应该表现完全相同但如果我更改test3它与测试无关,这意味着当我test=test2
实际上它正在做test2=new test
和{test3 = new test2
之类的事情时{1}}这对我来说似乎非常不合逻辑。假设我想创建自己的简单字节类,其行为类似于StringBuilder,其行为类似于String,StringBuilder类中的确切内容允许实例传递实例,而String类中的内容允许它通过使用自动创建新实例等号?我不明白test = test2在我给出的两个例子之间在逻辑上是否一致。它实际上看起来不可预测的不合逻辑。什么样的代码行实际上使这两个类之间存在差异?
当你使用与StringBuilder实例的等号时,它会传递实例,但是当你使用带有String实例的等号时,它会神奇地创建一个新实例。类中的哪一行代码确定等号的行为如何?我不喜欢这个,因为它实际上改变了等号的含义,所以我想知道至少哪一段代码改变了等号的定义。
答案 0 :(得分:2)
在2个类
之间实际产生这种差异的代码行
您未展示的代码行。要作为test3
附加到string
,您需要执行其他操作:
test3 = test3 + "abc";
(如果你没有在这里执行赋值,新生成的string
立即有资格进行垃圾收集,因为没有任何内容可以引用它。)
要test3
作为StringBuilder
追加,我们不会另外分配:
test3.Append("abc");
假设我想创建自己的简单字节类,其行为类似于StringBuilder,而行为类似于String
要创建类似StringBuilder
的类,您可以创建一个类,在调用Append()
之类的方法时修改其内部状态。要创建类似String
的类,您将创建一个创建类的新实例的类,其中包含由“修改”方法创建的更新状态。这些方法不更新自己的内部状态。
这完全是关于实现不可变类 - 没有编译魔术,它只是一个设计决策。