实例化有什么区别?

What difference does instantiating make?

假设我们有一个 class World 并且我们已经声明了 class 的实例 dreamWorldCase 1Case 2 除了少了一行之外有何不同?在第二种情况下实例化实际上有什么区别?我的意思是,毕竟 dreamWorld 在两种情况下都是一样的,对吧?

案例一:

void changeWorld(World outerWorld) {
    World dreamWorld;

    dreamWorld = outerWorld;
}

案例二:

void changeWorld(World outerWorld) {
    World dreamWorld;

    dreamWorld = new World();
    dreamWorld = outerWorld;
}

其中 outerWorldWorld class 的一个对象,它是在别处创建的,比如说,作为方法参数提供(我不确定它的提供方式是否重要).

PS 伙计们,感谢你们所有及时而有帮助的回复,抱歉我迟来的感激之情(我花了一些时间阅读一些我认为完全理解你们的回复所必需的文献)。

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

编辑:
正如@Rob 指出的那样,对上述声明的一个警告是 World 的构造函数执行一些外部交互,实例化它仍然会产生影响。但是,将其分配给 dreamWorld 是没有意义的,因为此引用将丢失。

在案例 1 中你:

  • 声明一个变量
  • 将变量设置为一个值

在情况 2 中你:

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

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

情况 2 中,将在 dreamWorld = new World(); 行中创建一个额外的对象,稍后将对其进行垃圾回收,因为您正在覆盖它

唯一不同的是,您已经为另一个 World 对象分配了一些内存,由于您立即取消了它的引用,该对象随后将被垃圾收集器清除。

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

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

这表示您问这个问题表明您没有完全意识到在对引用使用 = 运算符时发生了什么。

dreamworld 和 outerworld 将指向同一个对象实例。您复制了您没有复制对象的引用。所以如果你改变外部世界,梦想世界也会随之改变。你必须使用方法或构建你自己的方法,将外部世界实例的clone/copy分配给梦想世界实例。

修订:根据 World class 的构造函数的不同,结果可能会大不相同。例如,它可以更新 class 的静态成员、创建文件或任何数量的东西。 :) 但是如果 class 是一个简单的 Bean,并且构造函数没有副作用,那么这里的所有答案都适用 :)。

显然如其他答案中所述,您的代码设置不正确。但是实例化的第一个原因是,如果你 运行 这个游戏在 server/multiplayer 上,如果第 1 个人达到了梦幻世界的水平并且第 2 个人开始游戏,它将覆盖世界变量并且第 1 个人会神奇地打开外世界.

将实例化视为从模板创建实例或对象。 你实例化一个 class 来创建一个对象,一个 class.

的具体实例

How to instantiate an object in java?