![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 | |
|
Gast
Beiträge: n/a
|
Hi all,
in unserem Script heißt es : Zitat:
habe Keine Ahnung warum, denn die Klasse String überschreibt die clone() Methode von der Klasse Object NICHT (s. API). Anbei der Code viel spaß beim testen : Java Code:
schonmal danke für Antworten |
|
|
|
|
Nach oben #2 |
|
Gast
Beiträge: n/a
|
Hi,
bei clone gibt es zwei Dinge zu beachten: 1.) clone ist per default als protected definiert. Nur für bestimmte Klassen (und die Arrays gehören dazu) ist clone public. Um das zu ändern, muß eine public clone Methode in der Klasse angelegt werden. 2.) MUSS Cloneable implementiert werden. Dies ist ein Interface ohne Methode, d.h. es müssen gar keine Methoden überschrieben werden, aber wenn es nicht implementiert wird, funktioniert clone nicht. Java Code:
Damit gehts. |
|
|
|
Nach oben #3 |
|
Gast
Beiträge: n/a
|
Vielen Dank das clonen von normalen Objekten funzt nun schonmal.
Jedoch habe ich immer noch das Problem bei dem oben geposteten Array. Obwohl das Feld geklont ist , und ich im geklonten Feld die Namen ändere werden die auch in den Klon Quellen geändert, was ja nicht so ein soll. (ist aber so, siehe Ausgabe) |
|
|
|
Nach oben #4 |
|
Gast
Beiträge: n/a
|
Alles klar:
Du hast zwar das Feld geklont, aber clone funktioniert nur als "shallow" clone. Das bedeutet, dass nur die Referenzen kopiert werden, nicht aber die Objekte geklont werden. Das gleiche gilt auch für den clone des Objektes. Auch hier wird nur die Referenz geklont. Das fällt aber nicht weiter auf, weil ein String ohnehin nicht verändert werden kann. Wenn Du in einem Objekt aber auf andere veränderbare Objekte verweist, würde Dir das gleiche passieren. P.S. Ach ja, und was man auch nicht vergessen darf: führt dazu, dass nach dem Clonen die Variable m im "alten" und im geklonten Objekt auf dasselbe Objekt zeigen, ganz anders als man es erwarten sollte. |
|
|
|
Nach oben #5 |
|
Gast
Beiträge: n/a
|
Euer Skript oben kann ich auf zwei Arten interpretieren :badgrin: :
A) Um ein Feld zu kopieren, müssen die einzelnen Objekte geklont werden, d.h. neues Feld und die einzelnen Objekte per clone kopieren. oder B) Der Autor des Skriptes hat keine Ahnung und glaubt irrtümlich, dass clone ein "deep copy" durchführt, bei dem auch die Inhalte kopiert werden bzw. hat sich mit dem Unterschied zwischen einem "shallow clone" und "deep clone" nicht so richtig vertraut gemacht. Suchs Dir aus |
|
|
|
Nach oben #6 |
|
Gast
Beiträge: n/a
|
Nachbemerkung:
Vermutlich ist es für die Lösung der Aufgabe nicht hilfreich, aber es gibt eine einfache Möglichkeit, ein deepClone mit Java-Bordmitteln zu erreichen. Hierfür müssen aber alle Element "Serializable" sein, die kopiert werden müssen. Ich habe das Beispiel oben mal so umgestellt, dass ein deepCopy durchgeführt wird. Viel Spaß! Java Code:
|
|
|
|
Nach oben #7 | |
|
Gast
Beiträge: n/a
|
waow vielen Dank für die Antwort !
Also ich glaub Ahnnug hat der Mann schon nur er kanns nicht in verständliches Deutsch bringen ok also clone() macht eine flache Kopie ... schade aber warum scheint clone() bei String oder int Feldern tief zu sein ? Wenn ich bei einem solchen geklonten Feld nämlich einen Wert ändere hat das keine Auswirkung auf die Quelle. EDIT: Ahh ok bei den Basisdatentypen reicht die flache Kopie (Kopie der Werte, weil es keine Objekte sind), aber was ist mit String ? Edit2: ahh ok das meinst du dann wohl hiermit: Zitat:
Also folgendeswäre nun auch flach oder ? : Java Code:
Juhu das hat mal wieder alles umgeworfen, aber wenisgtens weiß ich jez wies wirklich ist *g Ich dachte nämlich das wäre eine flache Kopie: int feld2[] = feld1; Aber das is nun wohl eine Oberflache Kopie bzw. gar keine *juuhuu* edit3: kurz zu der clone() Methode oben beim Personen Feld: Da wird für das neue PersonenFeld neuer Speicher angelegt , aber es kommen dieselben Objekte (Personen) rein ... stimmt das ? danke nochmal gruß |
|
|
|
|
Nach oben #8 | |
|
Gast
Beiträge: n/a
|
Spitze! Besser hätte ich es nicht erläutern können.
Zitat:
Vielleicht meint ja euer Dozent, dass int[] neu = alt eine flache Kopie ist, weil wirklich nur die Referenz kopiert wird und kein Objekt. Frag lieber nochmal nach bei der Begriffsdefinition. Bei solchen Definitionen haben Dozenten ja bekanntermaßen immer recht |
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Lange Methode blockiert UI | Sayang | Allgemeine Java-Programmierung | 11 | 07.03.2006 22:43 |
| statische Methode per Reflection aufrufen | ehli75 | Allgemeine Java-Programmierung | 2 | 02.02.2006 13:17 |
| Methode in der main aufrufen, unterschied JApplet und JFrame | Gottzilla | Desktop-Applikationen und Grafik | 3 | 10.03.2005 10:12 |