9

Java 是否有 C++ 的默认复制构造函数?如果它有一个 - 如果我明确声明另一个构造函数(不是复制构造函数),它是否仍然可用?

4

7 回答 7

10

Java 没有内置的复制构造函数。

但是您可以编写自己的此类构造函数。请参见下面的示例:

class C{
    private String field;
    private int anotherField;
    private D d;

    public C(){}

    public C(C other){
        this.field = other.field;
        this.anotherField = other.anotherField;
        this.d = new D(other.d); //watch out when copying mutable objects; they should provide copy constructors, as well. Otherwise, a deep copy may not be possible
    }

    //getters and setters
}

class D{//mutable class

    //fields
    public D(D other){
        //this is a copy constructor, like the one for C class
    }
}
于 2013-12-09T13:39:23.073 回答
4

Java 没有默认的复制构造函数。您需要自己定义它。

于 2013-12-09T13:38:14.377 回答
2

不,它没有默认的复制构造函数。默认构造函数。

您不必为您的类提供任何构造函数,但这样做时必须小心。编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。在这种情况下,如果超类没有无参数构造函数,编译器会报错,因此您必须验证它是否存在。如果你的类没有显式的超类,那么它有一个 Object 的隐式超类,它确实有一个无参数的构造函数。

通常我会提供一个喜欢的,

public class CopyConEx {

      /**
      * Regular constructor.
      */
      public CopyConEx(type  field1, type field2) {
        this.field1 = field1;
        this.field2 = field2;
      }

      /**
      * Copy constructor.
      */
      public CopyConEx(CopyConEx aCopyConEx) {
        this(aCopyConEx.getField1(), aCopyConEx.getField2());   

      }
于 2013-12-09T13:38:40.443 回答
2

有一个复制构造函数(但不是默认构造函数),但应该式调用它(在 C++ 中,它会在需要时被隐式调用):

public MyClass(MyClass toCopy) { 
   someField = toCopy.someField; 
}
于 2013-12-09T13:39:06.930 回答
1

Java 支持克隆但不使用复制构造函数。请在下面找到有关 Java 克隆的 url。

http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx

于 2013-12-09T13:41:23.160 回答
1

在 Java 中,提供自动复制构造函数是没有意义的。

Java 不需要,因为您只能引用对象。(在 C++ 中,您可以按值传递对象,因此语法需要允许自动对象复制)。

如果您需要在 Java 中获取对象的深层副本,请实现Cloneable.

于 2013-12-09T13:45:32.590 回答
0

与 C++ 一样,Java 也支持复制构造函数。但是,与 C++ 不同的是,如果您不自己编写,Java 不会创建默认的复制构造函数。

另请参阅使用深拷贝编写拷贝构造函数。

于 2013-12-09T13:41:45.090 回答