// Java is always pass-by-value. When passing a reference variable,
// a copy of the value of the pointer was passed, not the object itself.
import java.util.Arrays;
class Dog {
public String name;
public Dog() {} //default constructor
public Dog(String name) {this.name = name;}
}
public class Main {
public static void update_obj(Dog myDog) {
myDog.name = "Changed";
}
public static void update_obj_v2(Dog myDog) {
myDog = new Dog();
myDog.name = "Changed v2";
}
public static void update_int(int i) {i++;}
public static void update_Integer(Integer i) {i++;}
public static void update_String_to_lower(String str) {str.toLowerCase();}
public static void update_array(String[] ary) {ary[0] = "Changed";}
public static void main(String[] args) {
// ---------- Custom mutable objects, arrays, changed --------------------------------
Dog max = new Dog("Max");
update_obj(max);
System.out.println("Dog's name is now: " + max.name); //Changed
Dog fido = new Dog("Fido");
Dog fido_alias = fido;
update_obj_v2(fido);
System.out.println("Dog's name is now (v2): " + fido.name); // Fido
System.out.println("Fido object address has not changed (v2): " + String.valueOf(fido == fido_alias)); // True
String[] fruits = {"Apple", "Orange"};
update_array(fruits);
System.out.println(Arrays.toString(fruits)); // [Changed, Orange]
// ---------- Primitives, Immutable objects, NOT changed ------------------------------
int i = 1;
System.out.println("int before update: " + i); // 1
update_int(i);
System.out.println("int after update: " + i); // 1
Integer j = 1;
System.out.println("Integer j before update: " + j); // 1
update_Integer(j);
System.out.println("Integer j after update: " + j); // 1
Integer k = 2;
k++;
System.out.println(k); // 3
String word = "SDSE";
System.out.println("String before update: " + word); //SDSE
update_String_to_lower(word);
System.out.println("String after update: " + word); //SDSE
}
}