Java: el estado del objeto no cambia después de la llamada al método [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Es Java "paso por referencia" o "paso por valor"? 78 respuestas

Beginner java question, pero no puedo entender cómo funciona call-by-Value (o Reference) en el siguiente ejemplo:

Cómo es que el valor de la cadena no se modifica después de salir del método mientras que mi objeto de cadena personalizado sí. ? Lo mismo con otras clases como Date ..

public class StringMadness {

public static void main(String[] args) {
    String s = "Native String";
    CustomStringObject cs = new CustomStringObject();
    System.out.println("Custom String Before: " + cs.str);
    hello(cs);
    System.out.println("Custom String After: " + cs.str);

    System.out.println("Native String Before: " + s);
    hello(s);
    System.out.println("Native String After: " + s);
}

private static void hello(String t) {
    t = "hello " + t;
}

private static void hello(CustomStringObject o) {
    o.str = "hello " + o.str;
  }
}

class CustomStringObject {

String str = "Custom String";
}

Respuestas a la pregunta(5)

Su respuesta a la pregunta