Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Notanumber en 02 de Julio 2014, 16:32
-
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.
-
Me falto una duda más perdón, porque en el siguiente codigo
// 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
-
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