【问题标题】:Does Java have a default copy constructor (like in C++)? [duplicate]Java 是否有默认的复制构造函数(如在 C++ 中)? [复制]
【发布时间】:2013-12-26 15:25:52
【问题描述】:

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

【问题讨论】:

  • 复制构造函数是指接受相同类型的对象并复制它的构造函数吗?如果是 - 那么不是,java 没有。
  • 不,它没有默认的复制构造函数。

标签: java c++ copy-constructor language-comparisons object-construction


【解决方案1】:

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

另见write a Copy Constructor using Deep copy.

【讨论】:

  • 只是添加 java 不会创建默认副本,因为在正常情况下不需要太多。它只是在java中通过引用传递。
【解决方案2】:

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
    }
}

【讨论】:

  • @RomanVottner 展开来说,这并不总是那么简单,尤其是当您无法更改其中一个可变字段来为其提供复制构造函数时。
【解决方案3】:

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

您不必为您的班级提供任何constructors,但这样做时您必须小心。编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。在这种情况下,如果超类没有无参数构造函数,编译器会报错,因此您必须验证它是否存在。如果你的类没有显式的超类,那么它有一个 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());   

      }

【讨论】:

    【解决方案4】:

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

    public MyClass(MyClass toCopy) { 
       someField = toCopy.someField; 
    }
    

    【讨论】:

    • 这不是默认。你必须自己定义。
    • 这就是我的意思..
    【解决方案5】:

    在 Java 中,提供自动复制构造函数将毫无意义。

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

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 如果您阅读任何其他答案,您会发现 Java 当然支持复制构造函数。它们在默认 下不存在,默认情况下不支持clone()(您必须实现Cloneable 并自己定义clone())。 (而且你的文章已经有将近 14 年的历史了......我不确定我是否仍然相信 Java 1.2 时代写的东西。)
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-14
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        • 2016-03-25
        • 2011-07-15
        • 1970-01-01
        相关资源
        最近更新 更多