某些类如何导致自动实例化而其他类不会

本文关键字:其他 实例化 何导致 | 更新日期: 2023-09-27 18:17:45

在下面的代码中,只有一个StringBuilder实例,test2和test3实际上指向new StringBuilder()的原始实例

StringBuilder test = new StringBuilder("test");
StringBuilder test2;
StringBuilder test3;
test2 = test;
test3 = test2;

所以我可以添加test3它也会添加原来的test。

我明白String是不可变的,但是下面的代码

String test = new String("test");
String test2;
String test3;
test2=test;
test3=test2;

使用相同的逻辑推理,它应该表现完全相同的方式,但如果我改变test3,它与测试无关,这意味着当我做test=test2时,它实际上是在做test2=new testtest3 = new test2这样的事情,这对我来说似乎非常不合逻辑。假设我想让我自己的简单字节类一个行为像StringBuilder和一个行为像String到底是什么在StringBuilder类允许实例被传递和什么在String类允许它自动创建一个新的实例只是通过使用等号?我不明白test=test2在我给出的两个例子之间是如何在逻辑上一致的。在我看来,这似乎不合逻辑。哪一行代码实际上使这两个类之间的差异?

当你对StringBuilder的实例使用等号时,它会传递该实例,但当你对String的实例使用等号时,它会神奇地创建一个新实例。类中的哪一行代码决定了等号的行为是这样的?我不喜欢这个,因为它实际上改变了等号的含义,所以我想知道至少是哪段代码改变了等号的定义。

某些类如何导致自动实例化而其他类不会

是哪一行代码使这两个类

有了区别

没有显示的代码行。要将test3附加为string,需要执行一个附加赋值:

test3 = test3 + "abc";

(如果这里不执行赋值,新生成的string立即有资格进行垃圾收集,因为没有任何东西持有对它的引用)

附加到test3作为StringBuilder,没有额外的赋值:

test3.Append("abc");

假设我想创建自己的简单字节类一个行为类似StringBuilder,另一个行为类似String

要创建一个像StringBuilder这样的类,你需要创建一个类,当像Append()这样的"修改"方法被调用时,它会修改它的内部状态。要创建像String这样的类,您需要创建一个类,它创建类的新实例,其中包含由"修改"方法创建的更新状态。这样的方法不会更新自己的内部状态。

这都是关于实现不可变类的——没有编译器的魔法,这只是一个设计决策。