9

Hat Java einen Standardkopiekonstruktor als C++? Wenn es eins hat - bleibt es verwendbar, wenn ich explizit einen anderen Konstruktor (keinen Kopierkonstruktor) deklariere?Hat Java einen Standard-Kopierkonstruktor (wie in C++)?

+0

Mit einem Kopierkonstruktor meinen Sie einen Konstruktor, der ein Objekt des gleichen Typs akzeptiert und dupliziert? Wenn ja - dann nein, Java hat das nicht. – Cruncher

+0

Nein, es hat keinen standardmäßigen Kopierkonstruktor. –

+2

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

Antwort

8

Java hat keine eingebauten Kopierkonstruktoren.

Aber Sie können Ihre eigenen Konstruktoren schreiben. Sehen Sie ein Beispiel unten:

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

Das ist richtig. –

+1

@RomanVottner Um zu erweitern, ist dies nicht immer einfach, besonders wenn Sie eines der veränderbaren Felder nicht ändern können, um ihm einen Kopierkonstruktor zu geben. – Cruncher

4

Java verfügt nicht über einen Standardkopiekonstruktor. Sie müssen es selbst definieren.

2

Nein, es gibt keinen Standardkopiekonstruktor. Ein Standardkonstruktor.

Sie müssen für Ihre Klasse keine constructors angeben, aber Sie müssen dabei vorsichtig sein. Der Compiler stellt automatisch einen Konstruktor ohne Argumente für jede Klasse ohne Konstruktoren zur Verfügung. Dieser Standardkonstruktor wird den Konstruktor ohne Argumente der Oberklasse aufrufen. In dieser Situation wird sich der Compiler beschweren, wenn die Superklasse keinen Konstruktor ohne Argumente hat, also müssen Sie überprüfen, ob dies der Fall ist. Wenn Ihre Klasse keine explizite Oberklasse hat, dann hat sie eine implizite Oberklasse von Object, die einen Konstruktor ohne Argumente hat.

Normalerweise stelle ich ein ein wie,

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

Es ist ein Copykonstruktor (aber nicht Standard eins), aber es sollte ausdrücklich aufgerufen werden (In C++, es wird werden implizit bei Bedarf) genannt:

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

Das ist nicht *** Standard ***. Sie müssen es selbst definieren. – dcsohl

+1

Das ist, was ich meinte .. – Maroun

1

Java unterstützt Klonen, aber nicht kopieren Konstruktor. Im Folgenden finden Sie eine URL zum Klonen von Java.

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

+0

Wenn Sie eine der anderen Antworten lesen, werden Sie natürlich feststellen, dass Java Kopierkonstruktoren unterstützt. Sie sind einfach nicht da von * default *, noch mehr als 'clone()' wird standardmäßig unterstützt (Sie müssen 'Cloneable' implementieren und' clone() 'selbst definieren). (Und Ihr Artikel ist fast 14 Jahre alt ... nicht sicher, ich würde immer noch etwas in den Tagen von Java 1.2 geschrieben vertrauen.) – dcsohl

0

wie C++, Java unterstützt auch Copykonstruktor. Im Gegensatz zu C++ erstellt Java keinen Standardkopiekonstruktor, wenn Sie keinen eigenen erstellen.

Siehe auch write a Copy Constructor using Deep copy.

+0

nur zum Hinzufügen von Java erstellt keine Standardkopie coz gibt es nicht viel dafür in normalen Situationen. Es ist nur per Referenz in Java. – Anugoonj

1

In Java die Bereitstellung eines automatischen Copykonstruktor sinnlos wäre.

Java benötigt keinen, da Sie nur Referenzen auf Objekte haben können. (In C++ können Sie Objekte als Wert übergeben, so dass die Grammatik eine automatische Objektkopie ermöglichen muss).

Wenn Sie tiefe Kopien eines Objekts in Java erstellen müssen, implementieren Sie Cloneable.