Autor Tema: ejercicio curso fundamentos programación Java. Asignación de igualdad CU00663B  (Leído 4796 veces)

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola. Dejo el ejercicio CU00663B del curso de fundamentos de programación Java.
Asignación de igualdad en Java. Referencias a objetos. Diferencia entre igualdad e identidad.

Ejercicio

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?


Si. Apuntan a un mismo objeto, el objeto Persona y a la hora de crearlos estos se crean con los mismos valores de los parametros que hay dentro del constructor esten o no por defecto.

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

No. Porque aunque son los mismos atributos al crearse por separado, sus valores son diferentes y apuntan a objetos diferentes.

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


Null. Ya que se inicializan por defecto y cuando se inicializan por defecto su valor es Null

Gracias un saludo.
 ;)
« Última modificación: 05 de Noviembre 2018, 18:46 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, comento algunas respuestas.

Pregunta a) No entiendo tu respuesta. "Si. Apuntan a un mismo objeto, el objeto Persona y a la hora de crearlos estos se crean con los mismos valores de los parametros que hay dentro del constructor esten o no por defecto."

Persona no es un objeto, es una clase. Puede haber un objeto Persona, o dos, o tres, o mil... Hablas del objeto Persona ¿a qué objeto persona te refieres?

Pregunta b) La pregunta dice que los atributos no se han inicializado en el constructor ¿Por qué dices que sus valores son diferentes?

Hay una relación de identidad especial en null. Mira lo que se comenta en https://aprenderaprogramar.com/foros/index.php?topic=1964.0

Pregunta c) Correcta

Salu2

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Hola Ogramar.

Citar
Buenas, comento algunas respuestas.

Pregunta a) No entiendo tu respuesta. "Si. Apuntan a un mismo objeto, el objeto Persona y a la hora de crearlos estos se crean con los mismos valores de los parametros que hay dentro del constructor esten o no por defecto."

Persona no es un objeto, es una clase. Puede haber un objeto Persona, o dos, o tres, o mil... Hablas del objeto Persona ¿a qué objeto persona te refieres?
Ok?.



No entiendes mi respuesta por que no has leído bien el enunciado de 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.

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.
Ok?

Citar
Pregunta b) La pregunta dice que los atributos no se han inicializado en el constructor ¿Por qué dices que sus valores son diferentes?
Los valores de estos objetos pueden ser los mismos pueden, valer por ejemplo 1 pero al crearse fuera del constructor la relación de identidad no es la misma ( en esta respuesta no me esplique bien).Por lo tanto aunque su valor sea 1 no se trata del mismo objeto son diferentes y cada vez que quieras cambiarle el valor a alguno tenderas que referenciarlos por "separado" (no dentro del mismo constructor) ya que apuntaran a objetos diferentes.

Citar
Hay una relación de identidad especial en null.

Yo creo que null es el valor que se le da a estos objeto y por lo tanto tendrían una relación de igualdad pero no serian "identicos" porque no pasan por el mismo constructor.

No es lo mismo igualdad que identidad.
Igual estoy equivocado hasta la medula.

Gracias Ogramar. ;)

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, yo sigo sin entender tu respuesta al apartado a) (igual me equivoco en algo). Si quieres pon un ejemplo del código tal y como lo estás pensando (puedes usar clases vacías para no tener que escribir código). Salu2

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Disculpad que me entrometa, pero esto no es correcto:
Citar
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:
Código: [Seleccionar]
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:
Citar
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í..

Código: [Seleccionar]
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
Código: [Seleccionar]
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:
Citar
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
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
a tres objetos de tipo Persona
No entendí el enunciado de la pregunta. Creía que se refería a un objeto Persona creado dentro de la clase TripulacionAvion.

Entonces si que tiene motivos Ogramar para no entender mi respuesta.

Al darles el valor Persona por referencia los tres apuntarían al mismo objeto.

No se por donde he leído que en java no existen clases solamente objetos.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
No se por donde he leído que en java no existen clases solamente objetos.

Es que una cosa no puede existir sin la otra.
Si existen objetos, existen clases, y viceversa.
Ya que para instanciar un objeto, ha de haber una clase que defina cómo va a ser ese objeto.

Vamos de hecho, todo lo que se hace en Java es una clase.
De ahí que todos los programas comiencen con las palabras: public class ...
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Ok.
Kabuto gracias por aclararme un poco las ideas.

Un saludo. ;)

Yo solo fumo tabaco.
Aunque parezca lo contrario.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Ja ja.
No hay de que.

Y al principio es normal hacerse un poco de lio con estos conceptos abstractos
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Aqui está en el libro.
Introduccion a la programación con java.
John S. Dean (Park University)
Raymond H. Dean (University of Kansas)
Revisión técnica: Carlos Villegas Quezada (Universidad Iberoamericana,Ciudad de México)

Citar
La clase Objeto es el ancestro de todas las otras clases. Es el ancestro primordial: la raíz de la jerarquía
de la herencia. Cualquier clase que de manera explícita extienda una superclase usa extends en su definición.
Siempre que alguien crea una nueva clase que no se extiende de manera explícita a alguna otra
clase, el compilador automáticamente la hace extenderse a la clase Objeto. Por consiguiente, en última
instancia todas las clases descienden de la clase Objeto
Pagina 456 párrafo 13.2 La clase Objeto y promoción automática de tipo

Según esta definición una clase no se puede entender sin objeto y viceversa.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Ahí lo que dice es que todas las clases en Java, absolutamente todas, son hijas de la clase Object.

Pero una cosa es hablar de objetos (instancias de una clase) y otra cosa es hablar de Object (que es una clase).
Si yo hago:

Código: [Seleccionar]
Object miObjeto = new Object();
String miCadena = new String();
Aquí, si hablo de Object, estoy hablando de una clase.
Si hablo de String, estoy hablando también de una clase.

Si hablo de miObjeto, estoy hablando de un objeto, que es una instancia de la clase Object.
Y si hablo de miCadena, estoy hablando también de un objeto, que es una instancia de la clase String, quien además, al igual que todas las clases, es hija de la clase (superclase mejor dicho) Object.

Que todas las clases hereden de Object, implica que todas las clases heredan automáticamente métodos como .equals(), .hashCode(), .toString(), etc...
En la API de Oracle se puede ver la documentación de Object

Sin embargo, estos métodos, han de ser sobreescritos por el programador para hacer que funcionen correctamente con la clase diseñada por el programador.
En el [url)https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=666:sobreescribir-metodos-tostring-y-equals-en-java-ejemplos-y-ejercicios-resueltos-comparar-objetos-cu00694b&catid=68&Itemid=188]capítulo CU00694B[/url] se habla de esto.

Bueno, en definitiva.
En Java hay clases y objetos, no puede ser de otra forma, pues una cosa implica la otra.
Java además tiene la peculiaridad, de que hay una superclase llamada Object de la cuál automáticamente todas las demás clases heredan de ella.

La intención de esto es establecer mediante la clase Object unos métodos mínimos que todo objeto en Java debería tener. Luego se les dará uso o no..., pero tenerlos, los tienen.
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Exacto.

Y después de esto EUREKA POR FIN LO COMPRENDI

No pueden haber clases sin objetos ni objetos sin clases pues ya que unos dependen de otros y todos derivan de la superclase Object.

Pero yo me forme un lío en los sesos y no lo entendía.
O eran todo objetos o eran todo clases y NO son objetos y son clases unos derivan de otros.

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Es que esto de la Programacion Orientada a Objetos (POO), al principio cuesta un poco entender la filosofía que implica.
Pero luego uno se da cuenta de que no es tán difícil, al contrario, es de lo más simple ya que de hecho lo que hace es trasladar a la programación la misma filosofía que explica el mundo real que nos rodea.

Por ejemplo, persona es un concepto abstracto. Es la definición de como ha de ser una persona: es un ser vivo, normalmente un Homo Sapiens, con 2 ojos, 4 extremidades, pelo, boca, un nombre, un sexo, una edad, una estatura, un peso, una procedencia, un parentesco, un idioma materno......

Pero no es algo concreto. Sin embargo, Paramonso, Kabuto, Ogramar... si son cosas concretas.
Somos las concreciones de la idea abstracta de una persona.
 Tenemos unas propiedades comunes individualizadas.
Nos parecemos mucho, pero somos únicos. El conjunto de nuestros atributos nos individualiza.
Todos tenemos ojos, pero no todos los tenemos verdes o azules. O si algunos coincidimos en tenerlos verdes, nos diferencia nuestro nombre. Y si también coincidiese, nos diferenciará nuestra procedencia, nuestro parentesco, nuestro número de teléfono...

Pues en POO es lo mismo.
Una clase Persona es la idea abstracta de cómo necesitamos que sea (que atributos y métodos ha de tener), según las necesidades de nuestro programa, los objetos concretos que luego iremos creando a partir de esta idea abstracta, es decir, de la clase Persona que hemos definido.


Así que la filosofía de la POO es prácticamente un espejo de la filosofía que describe nuestro mundo real.

Incluso en el mundo real contamos con algo similar a la clase Object de Java je je.
Como dijimos, la clase Object define unas propiedades básicas que todo objeto en Java ha de tener, por el simple hecho de ser un objeto de Java. Por eso todas las clases heredan obligatoriamente de Object.

Pues en filosofía del mundo real se habla de las "Propiedades sustanciales generales" que toda cosa sustanciada existente posee, por el simple hecho de ser una cosas sustanciada.

Por ejemplo, una persona y una piedra no se parecen absolutamente en nada. Son objetos o cosas completamente diferentes.
Sin embargo, por el simple hecho de ser "cosas sustanciadas" (objetos)  tienen propiedas comúnes como puede ser masa, volumen, inercia, energía... propiedas que va a tener cualquier cosa física de nuestro universo, ya sea un ratón, un arbol o un planeta.

Y bueno, suficiente filosofía por hoy
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

paramonso

  • Intermedio
  • ***
  • Mensajes: 241
  • El ignorante afirma, el sabio duda y reflexiona.
    • Ver Perfil
Si si todos esos conceptos los tenia claros, lo que pasa que me propuse yo que era primero la gallina o el huevo y en este caso no ha gallina ni huevo es PATO.

Antes de un objeto tiene que haber una clase,  un objeto no puede existir sin una clase y una clase puede existir sin un objeto.

En la Clase persona pueden estar los objetos Ogramar, Kabuto y paramonso, pero si no creamos la clase Persona estos tres objetos no pueden existir como tales.
Sin embargo la clase persona si que puede existir sin estos objetos.

Gracias por los comentarios.
Soy duro de mollera pero poco a poco va entrando.
Un saludo ;)

 

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