Autor Tema: Java uso de objetos como argumentos Ejercicio resuelto CU00642B  (Leído 4493 veces)

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Hola, soy Adrian y estoy haciendo mis primeros pasos en JAVA.

En el ejercicio CU00642B al crear el objeto taxiCond2 (en mi caso) toma perfectamente los campos de los objetos taxi1 y persona1.

La duda que me surge, es que pasa si después de crear taxiCond2 hago un cambio en un campo de taxi1, por ejemplo en la matricula.

Llevé esto a la practica y el resultado fue que taxiCond2 quedó con la matricula original y no con la nueva modificada en taxi1.

Según entendí estamos haciendo referencia a otro objeto, por tal motivo no debería actualizarse "matricula" en taxiCond2?
« Última modificación: 02 de Julio 2015, 20:45 por Alex Rodríguez »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Ejercicio CU00642B consulta sobre uso de objetos como argumentos
« Respuesta #1 en: 02 de Julio 2015, 02:54 »
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:

Código: [Seleccionar]
   /* 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:

Código: [Seleccionar]
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:
Código: [Seleccionar]
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.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Ejercicio CU00642B consulta sobre uso de objetos como argumentos
« Respuesta #2 en: 02 de Julio 2015, 14:00 »
Estimado RaGa, te respuesta es muy completa, muchas gracias por tu dedicación.

Voy a poner un ejemplo de mi constructor
Código: [Seleccionar]
//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() );
        vehiculoTaxi = objetoTaxi;
        //Creamos un objeto Persona con los mismos datos de la Persona recibidos como    parámetro
        conductorTaxi = objetoPersona;    }

Que sucede en este caso que no estoy usando la sentencia "new taxi ()" para llamar al constructor de clase?
Estoy creando un nuevo objeto "vehiculoTaxi" con los parametros de "objetoTaxi"?
Podriamos decir que

Código: [Seleccionar]
vehiculoTaxi = new Taxi (objetoTaxi.getMatricula(), objetoTaxi.getDistrito(),     objetoTaxi.getTipoMotor() );
        vehiculoTaxi = objetoTaxi;

y

Código: [Seleccionar]
vehiculoTaxi = objetoTaxi;
Son lo mismo en este ejercicio?
« Última modificación: 02 de Julio 2015, 20:44 por Alex Rodríguez »

RaGa

  • Moderador Global
  • Intermedio
  • *******
  • APR2.COM
  • Mensajes: 234
    • Ver Perfil
Re:Ejercicio CU00642B consulta sobre uso de objetos como argumentos
« Respuesta #3 en: 02 de Julio 2015, 15:20 »
Hola Adrián:

Sigue siendo muy interesante tu disyuntiva, y es precisamente en ese punto donde no quiero adelantarme al orden natural del curso.

Pero analicemos un poco más el asunto así mitigamos en algo la incomodidad de la duda.

Con la línea de código:
Código: [Seleccionar]
vehiculoTaxi = new Taxi (objetoTaxi.getMatricula(), objetoTaxi.getDistrito(),     objetoTaxi.getTipoMotor() );
estamos creando un NUEVO objeto tipo Taxi, que será uno de los campo de instancia del objeto TaxiCond.
Por lo tanto, si posteriormente modificara los atributos del objeto Taxi que se pasó como parámetro (supongamos la matricula), ese cambio no se verá reflejado en el objeto tipo Taxi vehiculoTaxi (campo del objeto TaxiCond), ya que son objetos distintos.
(Esto creo que ya lo tienes claro).

Ahora bien, con la línea de código:
Código: [Seleccionar]
vehiculoTaxi = objetoTaxi;
no estoy creando un nuevo objeto Taxi. Lo que estoy haciendo es asignar a vehiculoTaxi la REFERENCIA del objetoTaxi. Vale decir que a partir de esa asignación, vehiculoTaxi pasará a apuntar a la posición de memoria que ocupa el objeto objetoTaxi.
Y ahora en este caso, si se modificara la matricula de objetoTaxi, entonces ese cambio si se reflejará si consulto la matricula de vehiculoTaxi, ya que vehiculoTaxi ahora "apunta" al mismo lugar que objetoTaxi.

Conclusión: no tenemos dos objetos tipo Taxi independientes como en el caso anterior, tenemos un solo objeto tipoTaxi en una posición determinada de la memoria, pero REFERENCIADO (apuntado) tanto por objetoTaxi como por vehiculoTaxi.

Pero insisto en la siguiente, es un tema que se verá en detalle y mayor profundidad más adelante en el curso. Por ahora no nos preocupemos mucho si es un concepto que todavía no internalizamos.

adrit

  • Principiante
  • **
  • APR2.COM
  • Mensajes: 59
    • Ver Perfil
Re:Ejercicio CU00642B consulta sobre uso de objetos como argumentos
« Respuesta #4 en: 02 de Julio 2015, 15:59 »
Muy claro nuevamente!!

Voy a continuar con el curso para ver en detalle este tema.

Me parece interesante comentar lo siguiente;
Este es el segundo curso por internet que hago de java. Por lo tanto me es inevitable querer adelantarme como este caso, por tener o creer tener una idea del tema.
Para todos los que están aprendiendo java, les recomiendo hacer un segundo curso de cero ya que es muy positivo, es como preguntarle a un compañero o ir a clases particulares.
No se si me explico, ver la misma película dos veces es sumamente útil.

No mezclen contenido, un curso a la vez, empiecen algo y no parar hasta terminarlo. Y luego vean como continuar el aprendizaje, como complementarlo, en mi caso lo hago tomando clases de este excelente curso de nivel inicial.

Gracias!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".