Java – call by value

Im Gegensatz zu anderen Programmiersprachen wie z.B. Pascal oder C++ arbeitet Java mit der Methode “call by value”. Dies funktioniert folgendermaßen:

JAVA-Code:

	public class Test3 {
		public static void main(String [] args)
		{
			int i = 0;

			Point pnt = new Point(1, 1);
			System.out.println("X: " + pnt.getX());
			System.out.println("Y: " + pnt.getY());
			System.out.println("i: " + i);
			changeValues(pnt);
			changeInt(i);
			System.out.println("X: " + pnt.getX());
			System.out.println("Y: " + pnt.getY());
			System.out.println("i: " + i);
		}

		private static void changeValues(Point pnt) {
			pnt.setX(5);
			pnt.setY(5);
		}

		private static void changeInt(int i) {

			i = 666;

		}
	}

Ausgabe:

	X: 1
	Y: 1
	i: 0
	X: 5
	Y: 5
	i: 0

Wird in JAVA ein neues Objekt erstellt, dann wird das Objekt an und für sich im HEAP abgelegt, die Referenz auf dieses Objekt wird dabei im Stack erstellt und zeigt auf das Objekt im HEAP.

z.B.

	Point pnt = new Point(1, 1);

“pnt” wäre dann die Referenz auf das Objekt.

Wenn nun “pnt” einer Methode übergeben wird, wird intern in JAVA “Call-by-value” angewendet, das bedeutet aber nicht, dass hier das komplette Objekt “kopiert” wird, sondern nur(!) die Referenz auf das Objekt. Im ersten Eindruck könnte man glauben, dass es sich hierbei um “Call-by-Reference” handelt, stimmt aber nicht, da ja die Referenz auf das Objekt “kopiert” wird und die alte Referenz (also jene außerhalb der Methode) erhalten bleibt. Somit gibt es nach dem Methodenaufruf 2 unterschiedliche Referenzen auf ein und dasselbe Objekt. Die Referenzen werden im STACK-Speicher abgelegt und zeigen auf das Objekt, welches sich im HEAP-Speicher befindet.

Nun so gut, aber wie ist das mit primitiven Datentypen ála int, char, String, etc.?
Primitive Datentypen sind in JAVA an und für sich keine Objekte und werden dadurch direkt im STACK-Speicher der JVM abgelegt. Dadruch existieren auch keine Referenzen auf irgendein Objekt.

Was passiert nun bei Parameterübergabe einer Methode?
Hier wird wieder, wie überall in JAVA, “Call-by-value” angewendet. Da es bei den primitiven Datentypen keine Referenzen auf Objekte gibt, werden die Werte der Variablen direkt im Stack für die aufzurufende Methode kopiert. Dh. die neuen Werte sind nur innerhalb der Methode gültig.


Subscribe to comments Comment | Trackback |
Post Tags:

Browse Timeline


Add a Comment


XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>