实例化有什么区别?

时间:2016-03-25 14:00:09

标签: java instance

假设我们有一个类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 感谢您提供的所有提示和有用的回复,以及对我的延迟感谢的抱歉(我花了很多时间阅读一些我觉得有必要完全理解您的回复的文献。)

6 个答案:

答案 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)

显然,如其他答案中所述,您的代码设置不正确。但实例化的一个理由是,如果你在服务器/多人游戏中运行这个游戏,如果第一个人进入梦想世界,第二个人开始游戏,它将覆盖世界变量,第一个人将神奇地在外部世界。

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

How to instantiate an object in java?