Autor Tema: Ejercicio CU00663B# equals diferencia igualdad identidad java referencias objeto  (Leído 4184 veces)

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
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?


Creo que si, si al diseñar el constructor del tipo TripulacionAvion hacemos una asignación de tipo = entre dos atributos con un tercero, con lo que los tres apuntarian a un mismo objeto. A su vez, habria dos objetos que ya no estarian apuntados por ninguna variable, por lo que serian  inaccesibles.

b) ¿Existiría relación de identidad cuando creemos un objeto TripulacionAvion entre los tres atributos si no se inicializaran en el constructor?

No, serían tres objetos distintos, aunque tuviesen la misma información.

c) ¿Cuál sería el contenido de los atributos si no se inicializan en el constructor y creamos un objeto de tipo TripulacionAvion?

Pues depende, si el constructor esta vacio y no inicializa los atributos, estos se inicializan por defecto con valor nulo o si son tipos definidos en otra clase, que es el caso, como se haya definido en el constructor de la otra clase.

Un saludo.
« última modificación: 08 de Abril 2015, 01:01 de Ogramar »

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2228
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Hola calderas

Respuesta a) es correcta

Respuesta b) Podemos decir que existe una identidad en null (situación especial). Conviene tener cuidado con esta respuesta.

null significa alguna de estas cosas: objeto declarado pero no inicializado, condición de terminación de una serie de objetos, el objeto no existe, el objeto no tiene un contenido definido, el contenido del objeto ha sido eliminado explícitamente estableciéndose a null.

En Java se cumple lo siguiente: null == null (en otros lenguajes no es así).

Por tanto si no se han inicializado piloto == copiloto1 resulta true y copiloto1 == copiloto2 también es true, y si consideramos que toda comparación con == que devuelve true implica una relación de identidad, sí habría relación de identidad. La identidad consistiría en "los tres objetos son el mismo objeto: null".

Hay que considerar null una situación especial de un objeto.


Respuesta c) No es correcta: si no se inicializan el contenido de los atributos será null.


Para quien quiera analizar el comportamiento de null, este ejemplo puede ser útil:

Definimos una clase cualquiera:

Código: [Seleccionar]
public class Clase1 {
    private int x;
    public Clase1()    {x = 0;}
}

Y probamos a crear un objeto de otra clase que tiene como atributos objetos de la Clase1:

Código: [Seleccionar]
public class Prueba {
    private Clase1 a;
    private Clase1 b;
    private Clase1 c;
   
    public Prueba() {}
   
    public void probando() {
        if (a==b) {System.out.println("Hay identidad entre a y b") ;}
        if (a!=b) {System.out.println("NO Hay identidad entre a y b"); }
        a = new Clase1();
        System.out.println("Objeto a: "+a);
        System.out.println("Objeto b: "+b);
        System.out.println("Objeto c: "+c);
        a = null;
        System.out.println("Objeto a: "+a);
    }
   
    public static void main (String[] Args) {
        Prueba p = new Prueba();
        p.probando();
    }
}

El resultado de ejecutar el código es:

Hay identidad entre a y b
Objeto a: Clase1@e0f1c2
Objeto b: null
Objeto c: null
Objeto a: null


Saludos!
Responsable de departamento de producción aprenderaprogramar.com

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Gracias por la corrección en la segunda pregunta.

Con respecto a la tercera, según tu ejemplo, cuando se crea una clase cuyos atributos son objetos de otra clase y en el constructor, no se inicializan, el valor de los atributos será siempre NULL.
Pero si, como haces en tu ejemplo, uno de eso atributos le asignamos un nuevo objeto "a = new Clase1();", y no lo inicializamos, este objeto no tendra el valor NULL, tendra información basura.

¿Lo he entendido bien?

Saludos.

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2228
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
No, una vez haces a = new Clase1(); esto significa que ya el objeto está inicializado. En este caso estará inicializado como establezca el constructor por defecto (que no recibe parámetros). Puede que los atributos del objeto carezcan de contenido con sentido, pero una vez que usas new ya tienes el objeto inicializado. Saludos
Responsable de departamento de producción aprenderaprogramar.com

el_calderas

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 43
    • Ver Perfil
Entonces,  ¿los objetos b y c tienen valor NULL desde el principio, ya que no se han inicializado y cuando se crea un nuevo objeto a no tiene valor NULL porque se ha inicializado con new?

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2228
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Exactamente, todo objeto declarado referencia a NULL hasta que lo inicializas usando la sentencia new  :)
Responsable de departamento de producción aprenderaprogramar.com

 

Esto es un laboratorio de ideas...
Aprender a programar

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".