Hola Adrián, veo que es tu primer hilo en el foro, por lo tanto me toca darte la bienvenida.
He de decirte primeramente que tu pregunta es muy interesante. También he de decirte que esa práctica de probar de distintas maneras un código, es la mejor forma de aprender, así que adelante con ello.
Bueno, yendo a la pregunta que formulaste, no quisiera adelantarme mucho a lo que todavía no se ha visto en el curso. El curso tiene una lógica y un orden progresivo bien pensado para ir incorporando sistemáticamente los conocimientos. De todos modos hagamos un análisis de lo que se ha hecho en ese código para ir sacando conclusiones.
Tenemos 3 clases: Persona, Taxi, y TaxiCond.
La clase Persona tiene dos campos de instancia: nombre (tipo String), y edad (tipo int).
La clase Taxi tiene tres campos de instancia de tipo String: ciudad, matricula, y distrito, y un campos de instancia de tipo int: tipoMotor.
La clase TaxiCond tiene dos campos de instancia: vehiculoTaxi (que es de tipo Taxi), y conductorTaxi (que es de tipo Persona).
Recordemos cómo es el Constructor de la clase TaxiCond:
/* Ejemplo - aprenderaprogramar.com */
//Constructor
public TaxiCond (Taxi objetoTaxi, Persona objetoPersona) {
//Creamos un objeto Taxi con los mismos datos del Taxi recibido como parámetro
vehiculoTaxi = new Taxi (objetoTaxi.getMatricula(), objetoTaxi.getDistrito(), objetoTaxi.getTipoMotor() );
//Creamos un objeto Persona con los mismos datos de la Persona recibidos como parámetro
conductorTaxi = new Persona (objetoPersona.getNombre() ); }
Entonces, vemos que el Constructor recibe como parámetros dos objetos: un objeto tipo Taxi, y un objeto tipo Persona.
Y aquí viene algo importante: con esos objetos recibidos como parámetros se crean NUEVOS objetos, y esos nuevos objetos serán los campos de instancia del objeto tipo TaxiCond. Son NUEVOS objetos, no son una referencia a los objetos que recibimos como parámetros.
Recordemos algo:
La clase TaxiCond tiene 2 campos de instancia: un objeto tipo Taxi que se llama vehiculoTaxi, y un objeto tipo Persona que se llama conductorTaxi.
Analicemos la siguiente línea de código del Constructor de esta clase:
vehiculoTaxi = new Taxi (objetoTaxi.getMatricula(), objetoTaxi.getDistrito(), objetoTaxi.getTipoMotor() );
vehiculoTaxi es el campo de instancia (tipo Taxi). El signo '=' nos dice que se va a realizar una asignación sobre él. Ahora bien ¿qué se le asigna? se le asigna un nuevo objeto (por eso la sentencia 'new') de un objeto tipo Taxi. En esa instanciación de un objeto tipo Taxi se pasan 3 parámetros al constructor de la clase Taxi: 2 tipo String, y uno tipo int ¿Cómo me doy cuenta de ello?
porque:
objetoTaxi.getMatricula() me devuelve un String que corresponde a la matrícula del objeto tipo Taxi que pasé como parámetro.
objetoTaxi.getDistrito() me devuelve un String que corresponde al distrito del objeto tipo Taxi que pasé como parámetro.
objetoTaxi.getTipoMotor() me devuelve un int que corresponde al tipo de motor del objeto tipo Taxi que pasé como parámetro.
Por lo tanto:
new Taxi (objetoTaxi.getMatricula(), objetoTaxi.getDistrito(), objetoTaxi.getTipoMotor() );
crea un nuevo objeto Taxi, con los mismos valores del objeto tipo Taxi que recibimos como parámetro. Y luego la referencia de ese nuevo objeto Taxi creado, se la asigna al campo de instancia vehiculoTaxi perteneciente al objeto tipo TaxiCond.
Entonces, quiero remarcar lo siguiente:
El objeto tipo Taxi que pasamos como parámetro a la clase TaxiCond, nos servirá para tomar los valores de sus atributos, y CREAR un NUEVO objeto tipo Taxi que será vehiculoTaxi.
Por lo tanto el objeto vehiculoTaxi es independiente del objeto Taxi recibido como parámetro.
Lo mismo sucede con el parámetro conductorTaxi del objeto TaxiCond.
Analízalo y cualquier duda, estamos aquí para ayudarte.