某些类如何导致自动实例化而其他类不会
本文关键字:其他 实例化 何导致 | 更新日期: 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 test
和test3 = 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
这样的类,您需要创建一个类,它创建类的新实例,其中包含由"修改"方法创建的更新状态。这样的方法不会更新自己的内部状态。
这都是关于实现不可变类的——没有编译器的魔法,这只是一个设计决策。