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
Antwort
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".
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. –
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. –
@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. –
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.
@ johnchen902 Sorry, es ist finalize() http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –
- 1. Unterschied der Enum zwischen Java und C++?
- 2. Unterschied zwischen Java und Java
- 3. C++ Unterschied zwischen '//' und '///'
- 4. Unterschied zwischen '.' und "." in Java
- 5. Unterschied zwischen c() und append()
- 6. Unterschied zwischen // und /// in C#
- 7. Unterschied zwischen Groovy Def und Java Object?
- 8. Unterschied in den Ausgaben zwischen C# und Java
- 9. Unterschied zwischen Profiler und Java-Instrumentierung
- 10. Unterschied zwischen JAVA und PHP AES-Verschlüsselung
- 11. Unterschied zwischen OR-Operator || und | in Java?
- 12. Java - Unterschied zwischen Swingworker und SwingUtilities.invokeLater()
- 13. Java: Unterschied zwischen PrintStream und PrintWriter
- 14. Unterschied zwischen Authenticode, SPC und Java CodeSign?
- 15. Unterschied zwischen Java Concurrency, Akka und RxJava?
- 16. Java Point, Unterschied zwischen getX() und point.x
- 17. Unterschied zwischen Java Optional und Scala Option
- 18. Unterschied zwischen Java DateUtils.ceiling und DateUtils.truncate
- 19. Unterschied zwischen RTTI und Reflektion in Java
- 20. Unterschied zwischen Paket und Verzeichnis in Java
- 21. Unterschied zwischen PriorityQueue und TreeSet in Java?
- 22. Java: Unterschied zwischen ReadWriteLock und ReentrantReadWriteLock
- 23. Unterschied zwischen JAVA_HOME und JRE_HOME
- 24. C# Generika Kopierkonstruktor
- 25. C++ Kopierkonstruktor Oddity
- 26. Was ist der Unterschied zwischen C# und visueller C#?
- 27. Protected Mitglied Unterschied in Java und C#
- 28. C++: Implementieren von Kopierkonstruktor und Kopierzuweisungsoperator
- 29. C++ Kopierkonstruktor, Provisorien und kopieren Semantik
- 30. Unterschied zwischen `% in%` und `==`
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
@Kal Wrong. Java unterstützt Kopierkonstrukteure einfach und die meisten Collections-Klassen liefern sie. – chrylis
@chrylis: automatische Kopierkonstruktoren? Ich denke nicht. –