Autor Tema: Polimorfismo de metodos. Curso aprender java desde cero, entrega CU00694B  (Leído 3527 veces)

Notanumber

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Buenas, tengo las siguientes dudas:
a) Por lo que he entendido cuando un método esta sobreescrito a la hora de la ejecución dinámica el método que usara será el más cercano, es decir si existe una herencia tal que persona>profesor y en cada una de ellas hay un método equals, al realizar profesor.equals recurrirá al método de profesor y lo mismo con persona, correcto?

b)Centrándonos ahora en un ejemplo concreto como el de la entrega 94:
Codigo:
// Código que añadimos a la clase Profesor. Sobreescritura del método equals ejemplo aprenderaprogramar.com
public boolean equals (Object obj) {
if (obj instanceof Profesor) {
Profesor tmpProfesor = (Profesor) obj;
if (super.equals(tmpProfesor) && this.IdProfesor.equals(tmpProfesor.IdProfesor) ) {
return true; } else { return false; }
} else { return false; }
} // Cierre del método equals

¿Por qué hace falta el uso de this.Idprofesor.equals.., he probado a quitar el this y usar simplemente IdProfesor.equals... y funciona igual, es correcto? No tengo muy claro el uso de this en estos contextos...

¿Por qué hace falta el uso de super.equals(tmpProfesor)... , java automáticamente no busca el método desde la clase inferior a la superior? según este razonamiento no debería buscar el solo sin el uso de la palabra super el metodo equals de la clase persona? He probado a quitar el super y el programa no funciona y no sé por qué esto es incorrecto.

Un saludo y espero haberme explicado bien,  muchas gracias por su ayuda.
« Última modificación: 13 de Septiembre 2014, 19:11 por Alex Rodríguez »

Notanumber

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Me falto una duda más perdón, porque en el siguiente codigo
 
Código: [Seleccionar]
// Código que añadimos a la clase Persona. Sobreescritura del método equals ejemplo aprenderaprogramar.com
public boolean equals (Object obj) {
if (obj instanceof Persona) {
Persona tmpPersona = (Persona) obj;
if (this.nombre.equals(tmpPersona.nombre) && this.apellidos.equals(tmpPersona.apellidos) &&
this.edad == tmpPersona.edad) { return true; } else { return false; }
} else { return false; }
} //Cierre del método equals

¿No se produce una recursión constante en el uso del equals dentro del metodo equals?
Un saludo y gracias

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2659
    • Ver Perfil
Hola, en relación a las dudas:

a) Correcto como indicas

b) El uso del this: hay casos en los que no es necesario (como este), pero lo puedes poner si quieres. Si no es necesario, ¿para qué ponerlo? Simplemente para remarcar o dejar claro que te estás refiriendo al objeto-en-sí, es decir, a un atributo o método de la propia clase y no a otra cosa (un parámetro u otra cosa). this actúa eliminando ambiguedades cuando existen, pero se puede poner siempre que quieras, no es algo que sólo puedas usar para eliminar ambiguedades.


Con super.equals estamos invocando el método equals de la clase padre como si fuera un método propio de la clase hijo. El equals de la clase padre pierde visibilidad en la clase hijo debido a que está sobreescrito. La forma de poder invocarlo es usar la palabra clave super. De esta forma indicamos que el método equals de la clase padre está embebido en la clase hijo, es decir, que para dos objetos ser iguales tiene que cumplirse la condición de igualdad de la clase padre y además algunas cosas suplementarias.

Tú puedes escribir: if ( this.IdProfesor.equals(tmpProfesor.IdProfesor) ) {

en este caso sin invocar super, pero estás cambiando las condiciones de igualdad. Podrías hacerlo si se considerara oportuno.

Respecto a si Java busca automáticamente métodos hacia las clases padres: sí, siempre que no estén sobreescritos. En este caso está sobreescrito, por tanto no usará el método de la clase padre a no ser que nosotros se lo indiquemos.



Sobre la última duda: ¿una recursión constante? Si te refieres a si el método equals se llama a sí mismo la respuesta es no. El método equals de persona es una cosa, el método equals de un String otra. Cuando escribimos this.nombre.equals(tmpPersona.nombre) estamos usando el método equals de String. Son métodos sobreescritos, por tanto su significado depende de qué objeto sea el que lo invoque.

Saludos  ;D

 

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