9

Является ли Java конструктором копии по умолчанию как C++? Если он имеет один - остается ли он полезным, если я объявляю другой конструктор (а не конструктор копирования) явно?Имеет ли Java конструктор копии по умолчанию (например, на C++)?

+0

С помощью конструктора копирования вы имеете в виду конструктор, который принимает объект того же типа и дублирует его? Если да, то нет, у java этого нет. – Cruncher

+0

Нет, у него нет конструктора копии по умолчанию. –

+2

http://stackoverflow.com/questions/827785/why-doesnt-java-have-a-copy-constructor – Cruncher

ответ

8

Java не имеет конструкторов экземпляров bulit-in.

Но вы можете написать свои собственные такие конструкторы. См. Пример ниже:

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

Это правильно. –

+1

@RomanVottner Чтобы расширить, это не всегда просто, особенно если вы не можете изменить одно из полей, которые изменяются, чтобы дать ему конструктор копирования. – Cruncher

4

В Java нет конструктора копии по умолчанию. Вам нужно будет определить это самостоятельно.

2

Нет, у него нет конструктора копии по умолчанию. Конструктор по умолчанию.

Для вашего класса необязательно указывать 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()); 

     } 
2

Существует копия конструктор (но не по умолчанию один), но оно должно быть названо явно (В C++ это будет быть неявно вызывается при необходимости):

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

Это не *** по умолчанию ***. Вы должны определить это самостоятельно. – dcsohl

+1

Вот что я имел в виду .. – Maroun

1

Поддержка клонирования Java, но не использование конструктора копирования. Ниже приведен URL-адрес для клонирования Java.

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

+0

Если вы прочтете любой из других ответов, вы обнаружите, что, конечно, Java поддерживает конструкторы копирования. Их просто нет * по умолчанию *, не более, чем 'clone()' поддерживается по умолчанию (вы должны реализовать 'Cloneable' и определять' clone() 'самостоятельно). (И вашей статье почти 14 лет ... не уверен, что я все равно буду доверять чему-то, написанному во времена Java 1.2.) – dcsohl

0

Как C++, Java также поддерживает конструктор копирования. Но, в отличие от C++, Java не создает конструктор копии по умолчанию, если вы не пишете свой собственный.

Также см write a Copy Constructor using Deep copy.

+0

просто добавить java не создает копию по умолчанию, потому что нет необходимости в ней в нормальных ситуациях. Это только переход по ссылке в java. – Anugoonj

1

В Java предоставление автоматического конструктора копии было бы бессмысленно.

Java не нужен, так как вы можете иметь только ссылки на объекты. (В C++ вы можете передавать объекты по значению, чтобы грамматика должна была автоматически копировать объект).

Если вам нужно взять глубокие копии объекта на Java, тогда реализуйте Cloneable.

Смежные вопросы