call by reference vs. call by value



  • hi,
    ich habe eine frage zu java und call by value vs. call by reference.
    - alle parameter werden in java via call by value uebergeben?

    - hat das apple object in der funktion changeApple eine kopie der referenz?
    warum funktioniert kann man dann innerhalb der funktion die farbe des apfels auf gruen setzen?

    /* package whatever; // don't place package name! */
    
    import java.util.*;
    import java.lang.*;
    import java.io.*;
    
    class Apple {
    	public String color="red";
    }
    
    /* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
    	public static void changeApple(Apple apple) {
    		//apple = new Apple();
    		System.out.println("address of apple inside func: " + Integer.toHexString(apple.hashCode()));
    		apple.color = "green";
    	}
    
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		Apple apple = new Apple();
    		System.out.println("address of apple before func: " + Integer.toHexString(apple.hashCode()));
    
    		System.out.println(apple.color);
    
    		changeApple(apple);
    
    		System.out.println("address of apple after func: " + Integer.toHexString(apple.hashCode()));
    		System.out.println(apple.color);
    	}
    }
    

    ausgabe:

    address of apple before func: 14920f8
    red
    address of apple inside func: 14920f8
    address of apple after func: 14920f8
    green
    


  • alle parameter werden in java via call by value uebergeben?

    Nein, wie kommst du darauf ?
    Nur primitive (int, float, ...) werden in Java by Value übergeben.
    Objekte von Klassen werden immer by Reference übergeben. Das erklärt auch das Verhalten. 😉

    Btw, "apple.hashCode()" liefert dir nicht die Addresse des Objekts, sondern nur einen Hashcode. Zwei Objekte mit verschiedenen Addressen aber selben Membern haben auch den selben Hashcode.
    Addresse in Java abfragen ist unmöglich. Ist aber auch nicht nötig. 😉



  • DarkShadow44 schrieb:

    Objekte von Klassen werden immer by Reference übergeben.

    Das stimmt so nicht:
    http://www.javaranch.com/campfire/StoryCups.jsp



  • Da noch keiner die Frage beantwortet hat...

    siri1 schrieb:

    hi,
    ich habe eine frage zu java und call by value vs. call by reference.
    - alle parameter werden in java via call by value uebergeben?

    - hat das apple object in der funktion changeApple eine kopie der referenz?
    warum funktioniert kann man dann innerhalb der funktion die farbe des apfels auf gruen setzen?

    Beides ja. Das funktioniert gerade deshalb, weil über die Referenz apple dasselbe Objekt angesprochen wird wie in der main-Methode -- die Referenz wird beim Aufruf kopiert, nicht das Objekt. Du kannst also sämtliche Felder und Methoden des Originalobjektes ansprechen; was du nicht kannst, ist die Referenz ändern:

    // Funktioniert nicht wegen Call-by-value
    void vertauschen(Apple a1, Apple a2) {
      Apple temp = a1;
      a1 = a2;
      a2 = temp;
    }
    

Log in to reply