为什么Java没有复制构造函数?

Cug*_*uga 67 java copy-constructor

为什么Java不支持C++中的拷贝构造函数?

cle*_*tus 132

Java确实如此.他们只是不像C++那样被隐式调用,我怀疑这是你真正的问题.

首先,复制构造函数只不过是:

public class Blah {
  private int foo;

  public Blah() { } // public no-args constructor
  public Blah(Blah b) { foo = b.foo; }  // copy constructor
}
Run Code Online (Sandbox Code Playgroud)

现在C++将使用如下语句隐式调用复制构造函数:

Blah b2 = b1;
Run Code Online (Sandbox Code Playgroud)

在该实例中克隆/复制在Java中没有任何意义,因为所有b1和b2都是引用而不是像C++中那样的值对象.在C++中,该语句复制了对象的状态.在Java中,它只是复制引用.不会复制对象的状态,因此隐式调用复制构造函数是没有意义的.

这就是真的.

  • +1.虽然我们其余的人都在关注对象层次结构,但你直接切入语法 - 并且可能在你这样做的时候回答了OP的*真实问题. (18认同)
  • 如果Blah有一个非原始的话怎么办?喜欢:`public class Blah {private A foo; // A是一类公共Blah(Blah b){foo = b.foo; } //这不行吗?} (4认同)
  • 在这种情况下,如果你定义它,你可能会说"java*can*". (2认同)

Dan*_*lau 14

来自Bruce Eckel:

为什么[复制构造函数]在C++而不是Java中工作?

复制构造函数是C++的基础部分,因为它自动生成对象的本地副本.然而,上面的例子证明它不适用于Java.为什么?在Java中,我们操作的所有东西都是句柄,而在C++中,你可以拥有类似句柄的实体,你也可以直接传递对象.这就是C++拷贝构造函数的用途:当你想要获取一个对象并按值传递它时,从而复制该对象.所以它在C++中运行良好,但是你应该记住这个方案在Java中失败了,所以不要使用它.

(我建议阅读整个页面 - 实际上,从这里开始.)


dic*_*oce 10

我认为答案非常有趣.

首先,我相信在Java中所有对象都在堆上,而当你没有指针时,你会有"引用".引用具有复制语义,java在内部跟踪引用计数,以便其垃圾收集器知道什么是安全的.

由于您只通过可复制引用访问对象,因此大大减少了复制对象所需的实际次数(例如,在C++中将对象传递给函数(按值)会导致新对象被复制构造,在Java中只传递对象的引用).设计师可能认为clone()足以满足其余用途.

 

  • 我同意.复制构造函数确实在解决C++中的内存管理问题. (2认同)