Frage(n) zu Referenzen

Jellysheep

Erfahrenes Mitglied
Hi,
1. bei welchen primitiven Datentypen wird in Java bei "x = y;" der Wert und nicht die Referenz kopiert?
Ich denke mal, das ist int, long, float, double, char und short.
Stimmt das so?

2. Wird bei einer Klasse, die von Object abstammt, die Referenz oder das Objekt kopiert?

3. Kann bei einer eigenen Klasse die Zuweisung so überschrieben werden, dass das ganze Objekt kopiert wird, oder muss man dann eine copy()-Methode anlegen?
 
Hallo,

bei allen primitiven Datentypen wird der Inhalt kopiert.
Das sind die, die du genannt hast und noch byte und boolean. Ich hoffe das waren dann alle.

Und bei Referenz-Datentypen werden die Referenz und nicht das Object kopiert.
Das sind dann alle Objecte die von von Klassen erstellt wurden und alle Arrays (auch von primitiven Datentypen).

Nein, das kann nicht überschrieben werden. Es gibt schon eine solche Methode, die nennt sich clone. Allerdings musst du diese in jeder eigenen Klasse überschreiben.

Gruß

Sascha
 
Ok, dankeschön! ;)
Wenn ich die Clone-Methode überschreibe, ist dann auch das Verhalten bei "x = y;" anders?
 
Deep/Shallow Copy

Hi, hatte das Problem auch mal.

Anbei meine Lösung von damals.

Java:
	public static void shallowClone(Object o1, Object o2) throws Exception {
		for (Field f : o1.getClass().getDeclaredFields()) {
			f.setAccessible(true);
			f.set(o2, f.get(o1));
		}
	}

	public static Object deepClone(Object o1) throws Exception {

		// OBJECT -> OBJECT WRITER STREAM -> BYTE OUTPUT -> BYTE INPUT -> OBJECT
		// READER STREAM -> new OBJECT
		// + + +--- Buffer level --+ + +
		// + +---------------- Serialiation / rendering level -----+ +
		// +----------------------------------- Object level
		// ----------------------------------------+

		// step 1: define output stream
		ByteArrayOutputStream os = new ByteArrayOutputStream();
		// step 2: define object stream and let it write to the output stream
		ObjectOutputStream oos = new ObjectOutputStream(os);
		// step 3: fill buffer
		oos.writeObject(o1);
		// step 4: create object input stream connectected to a byte input
		// stream and flush buffer into byte stream
		ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(os.toByteArray()));
		// step 5: re-render object from input stream
		return ois.readObject();
	}

Grüße
gore
 
Zurück