Eigene Objekte per Inhalt kopieren!

Status
Nicht offen für weitere Antworten.
B

by Value

Gast
Hallo,
ich habe eine Klasse, diese einthaelt verschiedene Objekte. So - ich will von dieser Klasse nun eine exakte Copie in eine Variable uebergeben, dh. wenn ich was ander Kopie aendere soll sich der Inhalt des Originals nicht aendern (by value also). Wie mach ich das - ich dachte Java kennt kein by Reference, irgendwie trixt mich das anscheinend dauernd aus?

Ich hab ein Demo geschrieben dazu - wie man sieht, wird alles by value kopiert, bis auf das Objekt der "eigenen Klasse", muss ich dort etwa auch noch so eine klon-methode einbauen?? In der Realitaet habe ich ein Objekt einer Klasse, abgeleitet von ArrayList fuer wiederum eigene Panelklassen - geht das in Java nicht einfacher oder muss ich nun diese saemtlichen Klassen umschreiben, bzw mit dieser Funktion ergaenzen?

Code:
package muell;

import java.util.ArrayList;

import javax.swing.JPanel;

public class Klebrig {
	ArrayList<JPanel> pList;
	Schwampf sch;
	private class Schwampf{ // das eigene Objekt
		private String inhalt = "leer";
		public String getString(){return this.inhalt;}
		public void setString(String i){this.inhalt = i;}
	}
	ArrayList<String> list;
	String str;
	int idx;
	
	// main & start des prg's
	public static void main(String[] args) { Klebrig klebrig = new Klebrig(); klebrig.start();}
	public void start(){
		Klebrig nudel = new Klebrig();
		System.out.println("Vor der Kopie: ");
		status(nudel);
		
		Woanders wa = new Woanders(nudel);
		System.out.println("\nWoanders und Zustand der Kopie");
		status(wa.getKlon());
		
		System.out.println("\n..und das Original:");
		status(nudel);
	}
	
	// leerer ctor
	public Klebrig(){
		this.list = new ArrayList<String>();
		this.str = "vanilla";
		this.idx = 0;
		this.sch = new Schwampf();
		this.pList = new ArrayList<JPanel>();
	}
	
	// eine eigene methode zum klonen
	public Klebrig clown() {
		Klebrig k = new Klebrig();
		ArrayList<String> l = new ArrayList<String>();
		for(int cnt=0; cnt<this.getList().size(); ++cnt) l.add(this.getList().get(cnt));
		k.setList(l);
		k.setStr(this.getStr());
		k.setI(this.getI());
		k.setSchwampf(this.getSchwampf());
		ArrayList<JPanel> p = new ArrayList<JPanel>();
		for(int cnt=0; cnt<p.size(); ++cnt) p.add(this.getPList().get(cnt));
		k.setPList(p);
		return k;
	}
	
	// get/set
	public void setList(ArrayList<String> l){this.list = l;}
	public ArrayList<String> getList(){return this.list;}
	public void setStr(String s){this.str = s;}
	public String getStr(){return this.str;}
	public void setI(int i){this.idx = i;}
	public int getI() {return this.idx;}
	public Schwampf getSchwampf(){ return this.sch; }
	public void setSchwampf(Schwampf s){this.sch = s; }
	public ArrayList<JPanel> getPList(){return this.pList; }
	public void setPList(ArrayList<JPanel> pl){ this.pList = pl;}
	
	// output
	public static void status(Klebrig k){ System.out.println( "Laenge der list: " + k.getList().size() 
			+ "\nstr: " + k.getStr() 
			+ "\nint: " + k.getI()
			+ "\neigene Klasse: " + k.getSchwampf().getString()
			+ "\nLaenge der pList: " + k.getPList().size()); }
	
	
	
	/*
	 * 
	 */
	private class Woanders{
		private Klebrig klon = new Klebrig();
		public Woanders(Klebrig k){
//			kopier1(k); // geht nich
			kopier2(k); // geht teilweise
			doMassaker();
		}

		// kopieren aber WIE ???
//		public void kopier1(Klebrig k){ this.klon = k; }
		public void kopier2(Klebrig k){ this.klon = k.clown(); }
		

		// ein paar Veraenderungen
		public void doMassaker(){
			klon.getList().clear();
			klon.getList().add("Sie");
			klon.getList().add("haben");
			klon.getList().add("Gewonnen!");
			klon.setI(9999999);
			klon.setStr("$$$$$$$$$$$$$");
			klon.getSchwampf().setString("############");
			klon.getPList().clear();
			klon.getPList().add(new JPanel());
			klon.getPList().add(new JPanel());
			klon.getPList().add(new JPanel());
		}
		public Klebrig getKlon(){ return this.klon; }
	}
}
 

Ark

Top Contributor
Objekte werden grundsätzlich by reference behandelt, primitive Werte dagegen grundsätzlich by value.

Wenn Du eine 1:1-Kopie eines Objektes benötigst, bleibt Dir nichts anderes übrig, als ein neues Objekt anzulegen (d. h. irgendwo muss new auftauchen) und es mit den gleichen oder denselben Werten zu füllen, das kommt darauf an:

Wenn Instanzen einer Klasse immutable sind (z. B. Integer, String), dann empfiehlt es sich, dieselben Objekte wiederzuverwenden, da das Speicherplatz spart.

Handelt es sich jedoch um Primitive oder sind Instanzen veränderlich (z. B. StringBuffer, int, double, ArrayList), so musst Du Deine 1:1-Kopie mit Objekten bzw. Primitiven füttern, die nur die gleichen, aber nicht dieselben Werte bzw. Objekte enthalten. D. h, Du musst von diesen veränderlichen Objekten wieder zunächst eine 1:1-Kopie erstellen usw., das funktioniert also rekursiv. Bei Primitiven ist das einfacher, da sie ja nur by value behandelt werden und damit grundsätzlich 1:1-Kopien hin- und hergeschoben werden.

Das alles ist aufwendig, aber unumgänglich.

MfG
Ark

P.S.:
by Value hat gesagt.:
Code:
public Klebrig clown()
Ich sag' mal nichts … :roll:
 

byte

Top Contributor
Wie mach ich das - ich dachte Java kennt kein by Reference, irgendwie trixt mich das anscheinend dauernd aus?

Java kennt kein echtes Call by Reference. Bei der Parameterübergabe wird immer eine Copy der Referenz erzeugt/ übergeben. Das heisst, Du kannst über den Parameter keine Zeiger umbiegen. Du kannst aber sehr wohl das Objekt verändern, auf das die Referenz zeigt.

Deep Copies kannst Du in Java per Cloneable, Serializable, Copy-Constructor oder Reflection machen. Alle Möglichkeiten wurden schon diverse Male im Forum behandelt, also einfach mal suchen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
A Objekte in eigene Klasse auslagern Java Basics - Anfänger-Themen 2
B OOP Eigene Objekte in Arrays zusammenfassen Java Basics - Anfänger-Themen 3
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
I Eigene Java Tools Nutzung Java Basics - Anfänger-Themen 6
G eigene Bibliothek einbinden Java Basics - Anfänger-Themen 1
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
O Erste Schritte Eigene charAt(i) Methode schreiben Java Basics - Anfänger-Themen 10
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
P Maven und eigene Jars Java Basics - Anfänger-Themen 4
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
A Eigene Methoden entwicken Java Basics - Anfänger-Themen 3
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
H GSON-Bibliothek für eigene Programme benutzen Java Basics - Anfänger-Themen 2
H Klassen auf eigene Klasse zugreifen Java Basics - Anfänger-Themen 2
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
N Eigene Stream Methoden implementieren Java Basics - Anfänger-Themen 3
R eigene Graphikbedienelemente Java Basics - Anfänger-Themen 8
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
T Eigene Bedingung in IF-Bedingung Java Basics - Anfänger-Themen 22
P Java 8 & Eigene Applets Java Basics - Anfänger-Themen 3
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
G eigene Bibliothek in Java importieren Java Basics - Anfänger-Themen 5
D Klassen Eigene Klasse für ArrayList Java Basics - Anfänger-Themen 6
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
B Klassen Eigene "non static" Klasse in Main verwenden! Java Basics - Anfänger-Themen 12
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
J Eigene Klasse für die Variablen? Java Basics - Anfänger-Themen 3
P Eigene Knöpfe mit eigenem Listener Java Basics - Anfänger-Themen 5
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
O GUI: Eigene Fenster "Form"? Java Basics - Anfänger-Themen 13
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
O Denkanstöße für eigene Konfigurations-Datei Java Basics - Anfänger-Themen 12
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
C eigene Exception Java Basics - Anfänger-Themen 4
M externe JARs in die eigene JAR einbinden Java Basics - Anfänger-Themen 9
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
S Eigene Exception Klasse - fehlender Konstruktor mit String Java Basics - Anfänger-Themen 3
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
E Eigene Stackklasse Java Basics - Anfänger-Themen 7
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
S Eigene Exception Schreiben und Welche Auslösen wie ? Java Basics - Anfänger-Themen 7
P eigene kleine Datenverwaltung Java Basics - Anfänger-Themen 5
N Eigene Methoden-> Werte übergeben Java Basics - Anfänger-Themen 5
U Klassen Eigene Klassen importieren Java Basics - Anfänger-Themen 13
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E Object in eigene Klasse umwandeln? Java Basics - Anfänger-Themen 7
S Eigene Klassen addieren Java Basics - Anfänger-Themen 3
E Eigene class datum Java Basics - Anfänger-Themen 2
G Eigene MessageBox kreieren Java Basics - Anfänger-Themen 9
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
F Klassen Eigene Klasse definieren Java Basics - Anfänger-Themen 4
S Eigene KeyEvent-Mask erstellen Java Basics - Anfänger-Themen 4
X Eigene Libary Java Basics - Anfänger-Themen 2
Crashbreaker Eigene Java-Programm ohne hilfe des CMD starten Java Basics - Anfänger-Themen 11
A Klassen Eigene Datenklasse - Strings mit fixer Länge Java Basics - Anfänger-Themen 2
T eigene Exception Klasse Java Basics - Anfänger-Themen 12
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
P Vererbung Basisklasse soll eigene Methode benutzen Java Basics - Anfänger-Themen 38
F Eigene Klasse für die Keys von HashMap Java Basics - Anfänger-Themen 5
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
G Eigene Klasse als Array, zugriff? Java Basics - Anfänger-Themen 2
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
dataframe OOP Eigene typisierte Liste Java Basics - Anfänger-Themen 3
W GUI als eigene Klasse oder in die Startklasse? Java Basics - Anfänger-Themen 21
T Konstruktor für eigene Klasse erstellen Java Basics - Anfänger-Themen 6
H Buttonbefehle in eigene Klasse schreiben Java Basics - Anfänger-Themen 8
M Datentypen Eigene iterierbare Liste Java Basics - Anfänger-Themen 4
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
S Klassendiagramm - nur eigene Klassen? Java Basics - Anfänger-Themen 3
nrg Eigene simple List-Klasse programmieren Java Basics - Anfänger-Themen 3
C Eigene Interpreter-Programmiersprache mit Java Java Basics - Anfänger-Themen 17
B eigene Exception.... Java Basics - Anfänger-Themen 5
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
F Eigene Exception StackTrace und Message ist leer warum??? Java Basics - Anfänger-Themen 3
M Eigene Pakete in Eclipse erstellen Java Basics - Anfänger-Themen 5
M Eigene Hash Funktion Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
H eigene Schriftarten registrieren Java Basics - Anfänger-Themen 5
Kasoki Eigene Funktionen / Commands Java Basics - Anfänger-Themen 14
M Eigene LinkedList und Nodes Java Basics - Anfänger-Themen 20
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben