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
}
现在C++将使用如下语句隐式调用复制构造函数:
Blah b2 = b1;
在该实例中克隆/复制在Java中没有任何意义,因为所有b1和b2都是引用而不是像C++中那样的值对象.在C++中,该语句复制了对象的状态.在Java中,它只是复制引用.不会复制对象的状态,因此隐式调用复制构造函数是没有意义的.
这就是真的.
Dan*_*lau 14
来自Bruce Eckel:
为什么[复制构造函数]在C++而不是Java中工作?
复制构造函数是C++的基础部分,因为它自动生成对象的本地副本.然而,上面的例子证明它不适用于Java.为什么?在Java中,我们操作的所有东西都是句柄,而在C++中,你可以拥有类似句柄的实体,你也可以直接传递对象.这就是C++拷贝构造函数的用途:当你想要获取一个对象并按值传递它时,从而复制该对象.所以它在C++中运行良好,但是你应该记住这个方案在Java中失败了,所以不要使用它.
(我建议阅读整个页面 - 实际上,从这里开始.)
dic*_*oce 10
我认为答案非常有趣.
首先,我相信在Java中所有对象都在堆上,而当你没有指针时,你会有"引用".引用具有复制语义,java在内部跟踪引用计数,以便其垃圾收集器知道什么是安全的.
由于您只通过可复制引用访问对象,因此大大减少了复制对象所需的实际次数(例如,在C++中将对象传递给函数(按值)会导致新对象被复制构造,在Java中只传递对象的引用).设计师可能认为clone()足以满足其余用途.