Disculpad que me entrometa, pero esto no es correcto:
En este caso la Clase es TripulacionAvion y dentro de esta clase se ha creado un objeto Persona y de este objeto se han creado tes objetos dependientes de el que son Persona piloto; Persona copiloto1; Persona copiloto2.
Persona también es una clase en este caso, no es un objeto.
Aqui tenemos dos clases: TripulacionAvion y Persona.
La clase TripulacionAvion tiene tres atributos, que son de la clase Persona (que no es un objeto, es una clase).
Cuando vayamos a instanciar un objeto de la clase TripulacionAvion, por ejemplo:
TripulacionAvion nuevaTripu = new Tripulacion();
Tenemos un objeto, llamado nuevaTripu.
Y sus atributos, son otros tres objetos, llamados: piloto, copiloto1 y copiloto2.
Estos tres objetos, son de la clase Persona.
Ahora bien, respecto a la pregunta:
Considera una clase Java que se denomina TripulacionAvion y que tiene como atributos a tres objetos de tipo Persona: Persona piloto; Persona copiloto1; Persona copiloto2.
a) ¿Sería posible que al crear un objeto TripulacionAvion se produjera que piloto, copiloto1 y copiloto2 apuntaran a un mismo objeto, es decir, que existiera una relación de identidad entre los tres atributos?
Pues sí, podría ser posible, si por ejemplo se hiciera algo así..
Persona unaPersona = new Persona();
TripulacionAvion nuevaTripu = new Tripulacion();
nuevaTripu.setPiloto(unaPersona);
nuevaTripu.setCopiloto1(unaPersona);
nuevaTripu.setCopiloto2(unaPersona);
En este hipotético caso, los tres atributos estarían referenciando a un mismo objeto, el objeto unaPersona.
De este modo, los cambios que hagamos en cualquiera de los 4 objetos Persona (unaPersona, piloto, copiloto1 y copiloto2) afectará a todos. Porque en realidad todos están apuntando (referenciando) a un mismo y único objeto.
Ojo, solo afecta por igual los cambios que hagamos sobre ese objeto referenciado. Si para alguno de ellos, lo que hacemos es darle una nueva instancia (un nuevo new Persona() ), esto solo afecta al objeto en cuestión, el resto seguirán apuntando a la primera instancia.
Mirad, os dejo aquí un código rápido que demuestra como afectan estos cambios.
En el creo una unica Persona y el contructor de TripulacionAvion lo que hace es atribuirsela a los tres atributos: piloto, copiloto1 y copiloto2.
Ahí se ve como los cambios que hagamos a unos a otros, afectan a todos por igual.
Excepto para cuando alguno de ellos les damos unas nuevas instancias (new Persona() ).
Entonces la cosa cambia
package tripulacion;
public class PruebaTripulacion {
static class Persona {
String nombre;
public Persona(String nom) {
nombre = nom;
}
public void setNombre(String nom) {
nombre = nom;
}
public String getNombre() {
return nombre;
}
}
static class TripulacionAvion {
Persona piloto;
Persona copiloto1;
Persona copiloto2;
public TripulacionAvion(Persona persona) {
piloto = persona;
copiloto1 = persona;
copiloto2 = persona;
}
public void mostrarNombresTripulacion() {
System.out.println("Piloto: " + piloto.getNombre());
System.out.println("Copiloto1: " + copiloto1.getNombre());
System.out.println("Copiloto2: " + copiloto2.getNombre());
}
public void setNombrePiloto(String nombre) {
piloto.setNombre(nombre);
}
public void setPiloto(Persona persona) {
piloto = persona;
}
}
public static void main(String[] args) {
Persona unaPersona = new Persona("Andres");
TripulacionAvion nuevaTripu = new TripulacionAvion(unaPersona);
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Cambiamos el nombre del objeto unaPersona, afecta a todos--\n");
unaPersona.setNombre("Susana");
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Cambiamos el nombre del objeto piloto, afecta a todos--\n");
nuevaTripu.setNombrePiloto("Maverick");
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Creamos una nueva instancia de un objeto Persona para asignarselo a piloto--");
System.out.println("--Solo afecta a piloto--\n");
nuevaTripu.setPiloto(new Persona("John Rambo"));
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\n--Creamos una nueva instancia de un objeto Persona para asignarselo a unaPersona--");
System.out.println("--Solo afecta a unaPersona porque ahora hace referencia a una nueva instancia--\n");
unaPersona = new Persona("Soy una nueva Persona");
nuevaTripu.mostrarNombresTripulacion();
System.out.println("\nNuevo nombre de unaPersona: " + unaPersona.getNombre());
}
}
Esta es la salida que nos da por consola:
Piloto: Andres
Copiloto1: Andres
Copiloto2: Andres
--Cambiamos el nombre del objeto unaPersona, afecta a todos--
Piloto: Susana
Copiloto1: Susana
Copiloto2: Susana
--Cambiamos el nombre del objeto piloto, afecta a todos--
Piloto: Maverick
Copiloto1: Maverick
Copiloto2: Maverick
--Creamos una nueva instancia de un objeto Persona para asignarselo a piloto--
--Solo afecta a piloto--
Piloto: John Rambo
Copiloto1: Maverick
Copiloto2: Maverick
--Creamos una nueva instancia de un objeto Persona para asignarselo a unaPersona--
--Solo afecta a unaPersona porque ahora hace referencia a una nueva instancia--
Piloto: John Rambo
Copiloto1: Maverick
Copiloto2: Maverick
Nuevo nombre de unaPersona: Soy una nueva Persona