Foros aprenderaprogramar.com

Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: el_calderas en 16 de Febrero 2015, 16:20

Título: Ejercicio CU00663B# equals diferencia igualdad identidad java referencias objeto
Publicado por: el_calderas en 16 de Febrero 2015, 16:20
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.
Título: Re:Ejercicio CU00663B equals diferencias igualdad identidad java referencias objeto
Publicado por: César Krall en 17 de Febrero 2015, 08:42
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!
Título: Re:Ejercicio CU00663B equals diferencias igualdad identidad java referencias objeto
Publicado por: el_calderas en 17 de Febrero 2015, 15:43
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.
Título: Re:Ejercicio CU00663B equals diferencias igualdad identidad java referencias objeto
Publicado por: César Krall en 17 de Febrero 2015, 15:46
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
Título: Re:Ejercicio CU00663B equals diferencias igualdad identidad java referencias objeto
Publicado por: el_calderas en 17 de Febrero 2015, 16:25
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?
Título: Re:Ejercicio CU00663B equals diferencias igualdad identidad java referencias objeto
Publicado por: César Krall en 17 de Febrero 2015, 21:36
Exactamente, todo objeto declarado referencia a NULL hasta que lo inicializas usando la sentencia new  :)