假设我们有一个类World
,我们已经声明了该类的实例dreamWorld
。 案例1 与案例2 的不同之处在于它的一行更短?在第二种情况下实例化实际上有什么区别?我的意思是,毕竟dreamWorld
在两种情况下都是一样的,对吗?
案例1 :
void changeWorld(World outerWorld) {
World dreamWorld;
dreamWorld = outerWorld;
}
案例2 :
void changeWorld(World outerWorld) {
World dreamWorld;
dreamWorld = new World();
dreamWorld = outerWorld;
}
其中outerWorld
是在其他地方创建的World
类的对象,例如,作为方法参数提供(我不确定它是否与提供方式有关)。
PS 感谢您提供的所有提示和有用的回复,以及对我的延迟感谢的抱歉(我花了很多时间阅读一些我觉得有必要完全理解您的回复的文献。)
答案 0 :(得分:6)
案例2毫无意义。实例化一个新的World
对象,然后在分配dreamWorld = outerWorld
时丢失对该行的引用,将其留给垃圾收集器进行收集。
编辑:
正如@Rob指出的那样,对上述语句的一个警告是World
的构造函数执行一些外部交互,实例化它仍然会产生影响。然而,将其分配给dreamWorld
是没有意义的,因为此参考将丢失。
答案 1 :(得分:1)
在案例1中你:
在案例2中你:
两种方法都产生相同的最终结果,但第二种方法也会创建并销毁一个从未使用过的对象(当然,这完全是多余的)。
答案 2 :(得分:1)
在案例2 中,将在dreamWorld = new World();
行中创建一个额外的对象,这个对象将在以后进行垃圾回收,因为你要覆盖它
答案 3 :(得分:1)
它唯一的区别是你已经为另一个World对象分配了一些内存,然后垃圾收集器会立即将其擦除,因为你立即将其引用。
答案 4 :(得分:0)
所有其他答案都是正确的1和2,结果在逻辑上是相同的,但是案例2创建了一个丢失的对象实例,将被垃圾收集..(浪费逻辑)
其他人没有考虑到的是你的编译器很可能会识别这个并删除逻辑,并且结束字节代码将相同加上或减去编译警告..
这就是说你问这个问题的事实表明,当你在引用上使用=运算符时,你并不完全清楚发生了什么。
dreamworld和outerworld将指向同一个对象实例..你复制了你没有制作对象副本的引用。因此,如果你改变了外部世界,梦幻世界将随之改变。你必须使用方法或构建你自己的方法,将外部世界实例的克隆/副本分配给dreamworld实例。
修订:根据世界级的构造函数的结果,结果可能与DRASTICALLY不同。例如,它可以更新类的静态成员,创建文件或任何数量的东西。 :)但是如果类是一个简单的Bean,并且构造函数没有副作用,那么这里的所有答案都是:)。
答案 5 :(得分:0)
显然,如其他答案中所述,您的代码设置不正确。但实例化的一个理由是,如果你在服务器/多人游戏中运行这个游戏,如果第一个人进入梦想世界,第二个人开始游戏,它将覆盖世界变量,第一个人将神奇地在外部世界。
将实例化视为从模板创建实例或对象。 实例化一个类来创建一个对象,一个类的具体实例。