Java 实例化有什么区别?

Java 实例化有什么区别?,java,instance,Java,Instance,假设我们有一个类World,并且我们已经声明了该类的一个实例dreamWorld。除了短一行之外,案例1和案例2有什么不同?在第二种情况下实例化实际上有什么区别?我的意思是,不管怎样,梦世界在这两种情况下都是一样的,对吧 案例1: void changeWorld(World outerWorld) { World dreamWorld; dreamWorld = outerWorld; } void changeWorld(World outerWorld) { W

假设我们有一个类
World
,并且我们已经声明了该类的一个实例
dreamWorld
。除了短一行之外,案例1和案例2有什么不同?在第二种情况下实例化实际上有什么区别?我的意思是,不管怎样,梦世界在这两种情况下都是一样的,对吧

案例1

void changeWorld(World outerWorld) {
    World dreamWorld;

    dreamWorld = outerWorld;
}
void changeWorld(World outerWorld) {
    World dreamWorld;

    dreamWorld = new World();
    dreamWorld = outerWorld;
}
案例2

void changeWorld(World outerWorld) {
    World dreamWorld;

    dreamWorld = outerWorld;
}
void changeWorld(World outerWorld) {
    World dreamWorld;

    dreamWorld = new World();
    dreamWorld = outerWorld;
}
其中,
outerWorld
是在别处创建的
World
类的一个对象,例如,作为方法参数提供(我不确定如何提供它是否重要)

PS
谢谢你们的及时和有益的回复,伙计们,很抱歉我延迟了感谢(我花了时间阅读了一些文献,我觉得这些文献对于完全理解你们的回复是必要的)。

案例2毫无意义。实例化一个新的
World
对象,然后在分配
dreamWorld=outerWorld
时丢失对该对象的引用,将其留给垃圾收集器收集

编辑:
正如@Rob指出的,上述语句的一个警告是,
World
的构造函数执行一些外部交互,实例化它仍然会产生影响。然而,将其分配给
梦想世界是毫无意义的,因为此引用将丢失。

在案例1中,您:

  • 声明一个变量
  • 将变量设置为一个值
在案例2中,您可以:

  • 声明一个变量
  • 创建一个新对象
  • 将变量设置为一个值
  • 将变量设置为一个值
  • 销毁最近创建的对象

两种方法都会产生相同的最终结果,但第二种方法也会创建和销毁一个从未使用过的对象(当然,这是完全多余的)。

在案例2中,将在
dreamWorld=new World()中创建一个额外的对象行,稍后将被垃圾收集,因为您正在覆盖它

唯一的区别是您为另一个世界对象分配了一些内存,垃圾回收器会将其清除,因为您会立即核取其引用。

所有其他答案都是正确的1和2结果在逻辑上是相同的,但案例2创建了丢失的对象实例并将被垃圾回收。。(浪费的逻辑)

其他人没有考虑到的一点是,编译器很可能会识别这一点并删除逻辑,并且结束字节代码将相同,加上或减去编译警告

也就是说,您提出这个问题的事实表明,在引用上使用=运算符时,您没有完全意识到发生了什么

dreamworld和outerworld将指向同一个对象实例。。您复制了引用,但没有复制对象。所以如果你改变外面的世界,梦想世界也会随之改变。。您必须使用方法或构造自己的方法,使outerworld实例的克隆/副本成为将其分配给dreamworld实例的方法


修订:根据世界级的构造函数所做的工作,结果可能会截然不同。例如,它可以更新类的静态成员、创建文件或任何数量的内容。:)但是如果类是一个简单的Bean,并且构造函数没有副作用,那么这里的所有答案都成立:)。

显然,正如其他答案中所述,您的代码设置不正确。但实例化的一个原因是,如果您在服务器/多人游戏机上运行此游戏,如果人1进入梦幻世界,人2开始游戏,它将覆盖世界变量,人1将神奇地出现在外部世界

将实例化视为从模板创建实例或对象。 实例化一个类来创建一个对象,一个类的具体实例


dreamWorld=新世界()
在本例中完全没有用处,因为您正在覆盖下一行的
dreamWorld
。注意:
dreamWorld
outerWorld
是对世界对象的引用,而不是对象本身。Java只有原语变量和引用变量。提供的示例中的区别在于,在第二种情况下,您正在重新分配dreamWorld。第一行创建了一个新的World实例,并将其分配给dreamWorld。第二行立即将其重新指定为对outerWorld的引用。对第一行上创建的新实例的引用将丢失,并将在垃圾收集过程中清除。不一定为true。。如果世界类的构造函数执行一些非平凡的逻辑,比如更新静态成员、发送JMS消息、创建文件等。。。。只是一个固执的人。。我也做了同样的原始假设:)@Rob说得好,谢谢-在我的答案中编辑了一段新的内容