为什么Java没有拷贝构造函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (202)

为什么Java不像C ++那样支持拷贝构造函数?

提问于
用户回答回答于

Java的确如此。它们并不像C ++那样隐含地被调用,我怀疑这是你真正的问题。

首先,复制构造函数无非是:

public class Blah {
  private int foo;

  public Blah() { } // public no-args constructor
  public Blah(Blah b) { foo = b.foo; }  // copy constructor
}

现在C ++会隐式地用这样的语句调用复制构造函数:

Blah b2 = b1;

在这种情况下克隆/复制在Java中根本没有意义,因为所有b1和b2都是引用,而不是像C ++中那样的值对象。在C ++中,该语句会生成对象状态的副本。在Java中它只是复制引用。对象的状态不会被复制,因此隐式地调用复制构造器是没有意义的。

这就是它的全部。

用户回答回答于

从布鲁斯埃克尔:

为什么[复制构造函数]在C ++而不是Java中工作? 复制构造函数是C ++的基本部分,因为它会自动生成对象的本地副本。然而上面的例子证明它不适用于Java。为什么?在Java中,我们操纵的所有东西都是一个句柄,而在C ++中,您可以拥有像句柄一样的实体,并且还可以直接传递对象。这就是C ++拷贝构造函数的用途:当你想要一个对象并通过值传递它时,这样就复制了这个对象。所以它在C ++中工作正常,但是你应该记住这个方案在Java中失败,所以不要使用它。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励