import java.util.Arrays; import FigurasGeometricas.Punto; class EjemploDevolucionReferencia { public static Punto puntoMasProximo(Punto[] vectorPuntos, Punto punto) { Punto resultado = vectorPuntos[0]; // Suponemos que el vector contiene al menos un punto double minimaDistancia = punto.distancia(vectorPuntos[0]); for (int i = 1; i < vectorPuntos.length; i++) { double distancia = vectorPuntos[i].distancia(punto); if (distancia < minimaDistancia) { minimaDistancia = distancia; resultado = vectorPuntos[i]; // Asi copia la referencia v[i], no el punto referenciado } } return resultado; // Devuelve la referencia, no una copia del punto } public static void main (String [] args) { Punto [] v = new Punto[5]; // Asi tenemos un vector de 5 null System.out.println(Arrays.toString(v)); // Muestra los 5 null for (int i = 0; i < 5; i++) v[i] = new Punto(i, i); // Asi tenemos un vector de 5 referencias a puntos System.out.println(Arrays.toString(v)); // LLama a toString de cada punto Punto p1 = new Punto(2.5,3); Punto p2 = puntoMasProximo(v,p1); // En p2 tendremos una copia de la referencia al punto mas proximo a p1, no del punto p2.cambiar(7777,9999); // Por tanto, esto cambia el mismo punto referenciado por una de las componentes de v System.out.println(Arrays.toString(v)); // Y esto muestra el cambio // Veamos ahora lo que pasa si a la funcion le pasamos una copia de v obtenida // con el metodo clone() de los vectores en Java: p1 = new Punto(1.5,2); p2 = puntoMasProximo(v.clone(),p1); p2.cambiar(5555,3333); System.out.println(Arrays.toString(v)); // Como v.clone() no hace una copia en profundidad de v sino una copia superficial, // incluso asi p2 es una referencia del mismo punto referenciado por una componente de v. } }