¿Puede alguien explicarme cuál es el razonamiento detrás de pasar por "valor" y no por "referencia" en Java?

Soy bastante nuevo en Java (he estado escribiendo otras cosas durante muchos años) y, a menos que me falte algo (y estoy feliz de estar equivocado aquí), lo siguiente es un defecto fatal ...

String foo = new String();
thisDoesntWork(foo);
System.out.println(foo);//this prints nothing

public static void thisDoesntWork(String foo){
   foo = "howdy";
}

Ahora, soy muy consciente del concepto (bastante mal redactado) de que en Java todo se pasa por "valor" y no por "referencia", pero String es un objeto y tiene todo tipo de campanas y silbatos, así que uno esperar que, a diferencia de un int, un usuario pueda operar sobre lo que se pasa al método (y no quedarse atascado con el valor establecido por el sobrecargado =).

¿Puede alguien explicarme cuál fue el razonamiento detrás de esta elección de diseño? Como dije, no estoy buscando estar aquí, ¿y quizás me estoy perdiendo algo obvio?

Respuestas a la pregunta(15)

Su respuesta a la pregunta