1. HERENCIA CON LA CLASE OBJECT
La herencia es una forma de reutilización de software en la que se crea una nueva clase al absorber los
miembros de una existente, y se mejoran con nuevas capacidades, o con modificaciones en las capacidades
ya existentes. Con la herencia, los programadores ahorran tiempo durante el desarrollo, al basar las nuevas
clases en el software existente, probado y depurado, además de alta calidad. Esto también aumenta la
probabilidad de que un sistema se implemente y mantenga con efectividad.
Al crear una clase, en vez de declarar miembros completamente nuevos, el programador puede designar que
la nueva clase herede los miembros de una existente. La cual se conoce como superclase, y la clase nueva
como subclase. Cada subclase puede convertirse en la superclase de futuras subclases.
Una subclase puede agregar sus propios campos y métodos. Por lo tanto, una subclase es más específica
que su superclase y representa a un grupo más especializado de objetos. La subclase exhibe los
comportamientos de su superclase y puede modificarlos, de modo que operen en forma apropiada para la
subclase. Es por ello que a la herencia se le conoce algunas veces como especialización.
La superclase directa es la superclase a partir de la cual la subclase hereda en forma explícita. Una
superclase indirecta es cualquier clase arriba de la superclase directa en la jerarquía de clases, que define las
relaciones de herencia entre las clases. En Java, la jerarquía de clases empieza con la clase Object a partir de
la cual se extienden (o “heredan”) todas las clases en Java, ya sea en forma directa o indirecta. Es importante
aclarar que Java solo soporta la herencia simple. A continuación, se muestran los métodos de la clase Object:
Método Descripción
clone Este método protected, que no recibe argumentos y devuelve una
referencia Object, realiza una copia del objeto en el que se llama. La
implementación predeterminada de este método realiza algo que se
conoce como copia superficial: los valores de las variables de instancia
en un objeto se copian a otro objeto del mismo tipo. Para los tipos por
referencia, sólo se copian las referencias.
equals Este método compara la igualdad entre dos objetos; devuelve trué si
son iguales y false en caso contrario. El método recibe cualquier objeto
Object como argumento. Cuando debe compararse la igualdad entre
objetos de una clase en particular, la clase debe sobrescribir el método
equals para comparar el contenido de los dos objetos.
finalize El recolector de basura llama a este método protected para realizar las
tareas de preparación para la terminación en un objeto, justo antes de
que el recolector de basura reclame la memoria de esté.
getClass Todo objeto en Java conoce su tipo en tiempo de ejecución. El método
getClass devuelve un objeto de la clase Class, el cual contiene
información acerca del tipo del objeto, como el nombre de su clase
(devuelto por el método getName de Class).
hashCode Los códigos de hash son valores int útiles para almacenar y obtener
información en alta velocidad y en una estructura que se conoce como
tabla de hash.
wait, notify, notifyAll Los métodos notify, notifyAll y las tres versiones sobrecargadas de wait
están relacionados con la tecnología multihilo.
toString Este método devuelve una representación String de un objeto. La
implementación predeterminada de este método devuelve el nombre
del paquete y el nombre de la clase del objeto, seguidos por una
Lenguaje de
programación
Técnica profesional en desarrollo de software
Profesor: Andrés Herrera R.
Laboratorio
Herencia
Nombre:_________________________________________________________________________
2. 2
representación hexadecimal del valor devuelto por el método
hashCode del objeto.
PRÁCTICA 1
En la practica 1 intente recrear el ejemplo visto en clase para ello deberá crear un proyecto nuevo y crear una
clase de java llamada ejemploHerencia, deberá crear una clase Persona con los atributos: Nombre, apellido,
teléfono, identificaion y como método caminar y hablar. Una clase Profesor con los atributos: Salarios y notas
y como método Enseniar y calificar, este ultimo método debe recibir como parámetro una nota enviada desde
el main y retornar la nota. la clase Estudiante deberá contener los atributos materias de tipo arreglo y un
método aprender. Todos los métodos deberán imprimir por consola o mostrar un mensaje con su respectiva
funcionalidad del método.
una vez creadas las clases, deberá realizar una instancia nueva de Profesor y Estudiante, recuerde que para
poder hacer uso de los atributos de dichas clase debe heredar de la clase persona con extends y tener en
cuenta los modificadores de acceso (private, public, protected, default).
PRÁCTICA 2
Desarrolle el proyecto Practica-Object siguiendo los siguientes pasos. Recuerde que debe documentar cada
@todo el código programado.
1- Cree un proyecto Java de nombre <<Practica-Object>>.
2- Cree un paquete con el nombre <<com.EAM.>>
3- Cree un paquete con el nombre <<com.EAM.vo>>. En los paquetes vo se deben agregar todos los objetos simples.
4- Cree en el paquete vo un objeto de nombre Persona que tenga como atributos de clase: (int) id, (String) nombre, (int) edad
y (String) profesión. Además programe el método constructor de objeto usando todos sus atributos.
Se declara el atributo id con tipo int por objetivos del ejemplo.
5- Programe el los métodos getter y setter de todos los atributos de persona.
6- Cree en el paquete <<com.EAM>> una clase de nombre Aplicación e implemente el método <<main>> en ella.
7- Agregue en el <<main>> el siguiente código (recuerde tomar en cuenta el orden de los parámetros del métodos constructor
programado en el punto cuatro):
Persona persona1 = new Persona(12, "Roger", 22, "Futbolista");
Persona persona2 = persona1;
System.out.println(persona1.equals(persona2));
¿Qué resultado debería mostrarse? Ejecute la aplicación y verifique su funcionamiento.
¿Tuvo el resultado esperado? ¿Cuál es la causa del resultado obtenido?
8- Ahora agregue el siguiente código al final del del <<main>> programado en el punto siete:
3. 3
//Se modifica el id de la persona dos
persona2.setId(23);
//Se muestra por consola el id de la persona 1
System.out.println(persona1.getId());
¿Qué resultado debería mostrarse? Ejecute la aplicación y verifique su funcionamiento.
¿Tuvo el resultado esperado? ¿Cuál es la causa del resultado obtenido?
9- Como se ha podido notar en los dos puntos anteriores, en dos variables diferentes se puede almacenar una misma
instancia, por lo cual, si se modifica uno de los atributos de una de las variables, la otra tendrá la misma modificación. En
ocasiones puede ser beneficioso este comportamiento, pero en otros casos no. Para hacer una copia de los valores de los
atributos sin mantener la misma instancia se debe sobrescribir en el objeto Persona el método clone de la siguiente forma:
@Override
protected Object clone() {
return new Persona(id, nombre, edad, profesion);
}
Sobre escriba el método <<clone>> en la clase persona.
10- Remplace el código agregado al final del método <<main>> por el siguiente:
Persona persona1 = new Persona(12, "Roger", 22, "Futbolista");
Persona persona2 = persona1.clone();
//Se modifica el id de la persona dos
persona2.setId(23);
//Se muestra por consola el id de la persona 1
System.out.println(persona1.getId());
¿Qué resultado debería mostrarse? Ejecute la aplicación y verifique su funcionamiento. ¿Tuvo el resultado
esperado? ¿Qué causa el resultado obtenido?
11- Cuando se hace uso del método clone se realiza una copia superficial del objeto, por lo cual no se copia la instancia.
Ahora realice una reflexión respecto al siguiente código. Si se tienen dos variables tipo Personas con los mismo datos y los
desea agregar a una lista, ¿Debe ser considerado como la misma persona?
Agregue el siguiente código en el método <<main>>:
Persona persona1 = new Persona(12, "Roger", 22, "Futbolista");
Persona persona2 = new Persona(12, "Roger", 22, "Futbolista");
System.out.println(persona1.equals(persona2));
Si son la misma persona, ¿qué debería mostrar la impresión por consola?
Ejecute la aplicación y verifique su funcionamiento.
4. 4
12- Cuando se usa el método <<equals>> por defecto de la clase Object se realiza una comparación de espacios de memoria,
sin importar si tienen o no la misma información. Para usar de forma correcta el método <<equals>> se debe sobrescribir
de la siguiente forma:
@Override
public boolean equals(Object obj) {
if( obj instanceof Persona && ((Persona) obj).getId() == id){
return true;
}
return false;
}
Ejecute la aplicación y verifique su funcionamiento.
13- Cuando se sobrescribe el método equals es importante también hacerlo con el <<hashCode>> (en el caso que se deseen
usar los objetos con colecciones de tipo Hash). Las colecciones de tipo Hash buscan los objetos contenido por su valor
<<hashCode>> y luego comparan con el método equals. Complemente el código agregado anteriormente en el main con lo
siguiente:
System.out.println(persona1.hashCode());
System.out.println(persona2.hashCode());
Ejecute la aplicación y verifique su funcionamiento.
14- Como se pudo notar en el punto anterior las dos instancias tienen hashCode diferente, y no debería ser así, ya que
manejan la misma información (por lo cual se considera que es la misma persona). Sobrescriba el método hashCode de la
siguiente forma:
@Override
public int hashCode() {
return 97*id;
}
Ejecute la aplicación y verifique su funcionamiento.
15- Por ultimo programe el método toString de la clase Persona.
BIBLIOGRAFÍA
Deitel, P. J. & Deitel, H. M. (2012). Como Programar en java. Novena edición. México: Prentice Hall.