2013-09-28 23 views
5

Ich bin gespannt, wie Java Kopierkonstruktor unterstützt und wie unterscheidet es sich von C++? Ich würde gern das Java-Äquivalent der Logik verstehen, um die Regel von drei (Kopierkonstruktor, Destruktor, Zuweisungsoperator) von der Compilerseite der Geschichte auszuführen.Unterschied zwischen Java und C++ Kopierkonstruktor

+3

Nein, Java unterstützt nur Verweise auf Klassen, während C++ Werte und Verweise unterstützt, also unterstützt java keine ctors, dtors oder assign ops – Kal

+2

@Kal Wrong. Java unterstützt Kopierkonstrukteure einfach und die meisten Collections-Klassen liefern sie. – chrylis

+1

@chrylis: automatische Kopierkonstruktoren? Ich denke nicht. –

Antwort

8

Java hat keine spezifische linguistische Unterstützung für Kopierkonstruktoren. Eher kodieren Sie einfach den Staat, der im Konstruktor von Hand kopiert; z.B.

public class Person { 
    private String firstName; 
    private String lastName; 

    public Person(Person other) { 
     this.firstName = other.firstName; 
     this.lastName = other.lastName; 
    } 
    ... 
} 

Ich mag den Java-Äquivalent der Logik verstehen auszuführen Regel drei (Copykonstruktor, destructor, Zuweisungsoperator) von der Compiler Seite der Geschichte.

Der Kopierkonstruktor ist wie oben. Ist wirklich nur ein (einfaches) Designmuster.

Java bietet kein Äquivalent zum C++ - Zuweisungsoperator-Laden. Java unterstützt die Zuweisung von primitiven Typen und Referenztypen, aber nicht die Zuweisung von Objekten auf dieselbe Weise wie C++. Es ist ungewöhnlich, dass spezielle Aktionen erforderlich sind, wenn Sie einen Wert in Java zuweisen. Und in den Fällen, in denen Sie dies tun müssen, ist es üblich, die Logik in eine Setter-Methode zu bringen.

Java unterstützt finalize Methoden, die ähnlich sind in einigen Punkten zu C++ Destruktoren. Die Hauptunterschiede bestehen darin, dass finalize Methoden Operationen auf Objekten sind, die keine Referenzvariablen sind, und sie werden normalerweise lange nach der letzten Referenz des Objekts aufgerufen.

aber Sie selten Notwendigkeit finalize Methoden zu verwenden:

  • Java ist eine voll Müll Sprache gesammelt, und die beste Strategie-Management für Speicher ist nur die GC lassen sich darum kümmern.

  • Andere Ressourcen werden am besten mit "try/finally" oder "try with resources" verwaltet.

AFAIK, die einzige Sound Use-Case für finalize Verfahren ist für Ressourcen Reinigung, die versehentlich verloren gegangen war; z.B. weil jemand vergessen hat, sie mit den empfohlenen Mechanismen zu "schließen".

+0

Das Kopieren wird normalerweise für veränderbare "Wert" -Objekte durchgeführt - zB MutableRectangle (wenn Sie eine solche Klasse benötigen/wollen). Es ist wohl nicht wirklich sinnvoll/nützlich für "Identität" Objekte/Entitäten wie Person. –

+0

Dieses Code-Snippet ist die richtige Idee, würde aber aufschlussreicher sein, wenn es eine tiefgreifende Kopieraktion auslöst, was der Zweck des handgerollten Kopierkonstruktors ist. Strings und die nativen Skalare sind zu einfach. –

+1

@ThomasW - es ist ein schnelles Beispiel, um zu zeigen, wie Java funktioniert ... nicht etwas, das aus einer Domänenperspektive sinnvoll ist. Bitte konzentriere dich darauf, was die Antwort zu sagen versucht. –

5

Java hat nur Verweise auf Objekte. Sie können keine Inline-Objekte (im Stapel oder im Objekt) deklarieren.

Copykonstruktor

Java nicht eine haben. Du kannst einen schreiben, aber das wird selten gemacht.

, destructor

Java haben nicht ein. Es hat finalize(), aber dies ist sehr davon abgeraten.

Zuweisungsoperator

Java nicht über eine für Objekte, nur Verweise auf Objekte.

+0

@ johnchen902 Sorry, es ist finalize() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –

Verwandte Themen