Search code examples
c#javareference

Can I pass parameters by reference in Java?


I'd like semantics similar to C#'s ref keyword.


Solution

  • Java is confusing because everything is passed by value. However for a parameter of reference type (i.e. not a parameter of primitive type) it is the reference itself which is passed by value, hence it appears to be pass-by-reference (and people often claim that it is). This is not the case, as shown by the following:

    Object o = "Hello";
    mutate(o)
    System.out.println(o);
    
    private void mutate(Object o) { o = "Goodbye"; } //NOT THE SAME o!
    

    Will print Hello to the console. The options if you wanted the above code to print Goodbye are to use an explicit reference as follows:

    AtomicReference<Object> ref = new AtomicReference<Object>("Hello");
    mutate(ref);
    System.out.println(ref.get()); //Goodbye!
    
    private void mutate(AtomicReference<Object> ref) { ref.set("Goodbye"); }