Hola Mastermind.
El código que envías me da que pensar. Me has hecho ver cosas en las que no había pensado.
Mi convicción es que, en los objetos con nombre, el nombre solo es un puntero a una dirección de memoria (con el contenido de la variable). Esto hace que dos objetos con la misma identidad apuntan a la misma dirección de memoria (el contenido de la variable).
Dentro del ArrayList, corrígeme si me equivoco, se guarda únicamente los punteros a las direcciones de memoria de cada elemento. Si se guardara también el nombre que tenía el objeto fuera del ArrayList, habría de guardar también el nombre de todos los objetos idénticos.
Reconozco mi error al decir
La única referencia a un objeto dentro de un ArrayList, es su posición.
Pues independientemente de si un objeto tenía nombre antes de añadirlo a un ArrayList, siempre puedo asignar un elemento del ÄrrayList a un objeto recien creado.
'nombreDeObjeto = nombreArrayList.get(numeroElemento);'
A partir de este momento puedo acceder al elemento por su índice en el ArrayList y por su nombreDeObjeto pues son dos objetos idénticos.
No se si tenemos diferencias en nuestros conceptos, pero para mí la afirmación:
dentro del arrayList el objeto sigue teniendo nombre si entró con nombre
Me plantea dudas.
Gracias por tus comentarios.
Saludos.