Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
PROGRAMACIÓN ORIENTADA A OBJETOS: HERENCIAS Java permite el empleo de la herencia, característica muy potente que permite definir una clase tomando como base a otra clase ya existente. Esto es una de las bases de la reutilización de código, en lugar de copiar y pegar. Existen dos tipos de herencia sencilla y múltiple. Sencilla significa que sólo heredamos de una clase base, mientras que múltiple indica que tenemos varias clases base (por ejemplo un hidroavión hereda de barco y de avión). Java sólo soporta herencia simple. Al utilizar la herencia aparecen dos conceptos: super y this, this representa al objeto completo, en cambio super, sólo representa la parte heredada de la clase base. Cuando se hereda nos encontramos frente a un pequeño problema: ¿Qué sucede cuando se hereda un método de la clase base, el cuál estamos redefiniendo en la clase derivada? Esto es un caso de sobrescritura de métodos. La solución es simple, cuando estemos ejecutando el método de un objeto derivado se llamará al método de su propia clase, es decir el redefinido. Si lo que se quiere es emplear el método de la clase base, hay que emplear una técnica que consiste en usar: super.método(). Los constructores no son heredados, pero sí llamados. Es decir, cuando se construye un objeto de la clase derivada se llama al constructor de la clase derivada, pero antes de comenzar a ejecutarse se llama al constructor de la clase base, que tras ejecutarse continua la ejecución del constructor de la clase derivada. Se puede elegir qué constructor de la clase base es llamado, generalmente llamando al método super(), que representa al constructor de la clase base, pero al pasar parámetros distintos, seleccionamos qué constructor de la clase base queremos llamar. Supongamos ahora que tenemos algo que es capaz de encenderse, de apagarse, de iniciar una reproducción, de parar una reproducción, sin duda todos pensamos en un reproductor, pero por esa descripción encajan objetos como reproductor de cassete, reproductor de CD, el vídeo,... Llamaremos a la descripción interfaz, y los objetos que cumplen ese interfaz (es decir, tienen todas las funciones que definen el interfaz) diremos que implementan el interfaz. Pensemos ahora en el hecho que una persona que sabe iniciar una reproducción de un CD también sabe iniciar una reproducción de vídeo, en ambos casos debe de encender el objeto, iniciar la reproducción, parar la reproducción y apagar el reproductor. Eso significa que para la persona es transparente el tipo (clase) real del objeto reproductor que posea, ya que la persona sabe que puede ponerlo en marcha, apagarlo, sin necesidad de conocer la clase real, tan sólo debe de saber que es un objeto del tipo reproductor. -1-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
HERENCIAS – APLICACIÓN PRÁCTICA El tema de herencia en java se asemeja a la vida real, para esto debe existir una Clase Padre y una o varias Clases Hijos, en simples palabras podemos decir, que los Hijos heredaran atributos del Padre. Por ejemplo: Creemos la Clase Animal, que cumplirá con la función de ser una clase Padre; los atributos de la clase son: Raza String Nombre String Edad int En Java esto seria así:
Como vemos esta clase Animal, contiene atributos que quizás cualquier animal en particular debe de tener. Ahora crearemos una clase hijo, por ejemplo llamemos a esta nueva clase Perro.
Esta clase Perro, debe contener los mismos atributos de cualquier animal así como raza, nombre, edad y quizás otros atributos muy particulares a un perro. Entonces haremos que los atributos de la clase padre Animal se los herede a la clase hijo Perro, esto se logra haciendo uso de una palabra reservada por JAVA que es “extends”, veamos como es la sintaxis de la clase hijo una vez que deseamos que herede los atributos del padre: en la misma clase perro agregaremos lo siguiente:
Como podemos apreciar la sintaxis general para cualquier caso es la siguiente:
-2-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
public class [Nombre de la clase hijo] extends [Nombre de la clase padre]{ } •
Esto se lee: la Clase hijo extends=heredara de la clase Padre:
Posteriormente veremos esto en la aplicación con un ejemplo, la recomendación para ello es previamente haber entendido el concepto de clases, métodos y objetos.
EJEMPLO DE APLICACIÓN: En esta ocasión se creara una clase padre de nombre Persona, el cual contendrá los atributos necesarios que pueda tener una persona. Tales como son: código, nombre, apellidos, fnacimiento, direccion. Posteriormente se creara una clase hijo de nombre Alumno, con atributos que puede heredar de la clase Persona, así como atributos propios de un Alumno en particular.
Paso 1: Creamos la clase Persona con los atributos declarados:
Observación: en la declaración de cada atributo del tipo String estamos utilizando su método constructor vacío, otra manera de declarar es simplemente poner: String nombre; - String apellidos;
Paso 2: Crearemos su método constructor por defecto, quedando como sigue:
Paso 3: Creamos su métodos set y get para cada atributo, esto se puede crear manualmente o sino usando el asistente que nos brinda Java Virtual Machine, donde se procede de la siguiente manera: No ubicamos en cualquier parte de la hoja de código, damos clic derecho y buscamos – Refactor Encapsulate fields, tal como se muestra en la siguiente figura: -3-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
Luego nos aparecerá el siguiente asistente, donde le daremos check a cada uno, para que nos genere automáticamente los métodos set y get para cada atributo, sin necesidad de escribirlos manualmente:
Luego debajo de esto podemos observar que hay opciones: Fields Visibility : private Accessors’ Visibility : public El primero nos quiere decir que si deseamos que nuestras variables sean del tipo privado o quizás del tipo publico, por razones de seguridad se escoge privado, y cuando se da este caso estas variables serán vistas únicamente dentro de su misma clase mas no fuera de ella. -4-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
Lo segundo es sobre los métodos set y get que también se le conoces como métodos accesores, esto por defecto siempre son de tipo publico. Si modificar nada damos clic en refactor y vemos que pasa con nuestro código:
se puede apreciar algo nuevo en el código, fíjense los atributos todos se volvieron privados y los métodos set y get son del tipo publico.
Paso 4: dentro de esta misma clase crearemos un método asignarDatos, este método debe permitirme ingresar datos, y luego igualarlos o asignarlos a nuestros atributos creados en la clase Persona. Esto se hace como sigue:
Observación: los atributos declarados como argumentos dentro del método asignarDatos; estos atributos que van declarados dentro del paréntesis del método, no confundirlos con los que hemos creado líneas arriba, en el paso 1, estos atributos que se encuentran dentro del paréntesis pueden tener nombres diferentes, pero deben de conservar el tipo de dato: es decir: Nosotros hemos declarado en el paso 1 que el código es del tipo entero entonces cuando se trate de asignación este debe de conservar su mismo tipo de dato, lo que puede variar es el nombre de dichos atributos, es por ende -5-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
que dentro del paréntesis dato que es el entero, y así para cada variable.
se conserva el mismo tipo de
- Luego vemos en el código que se nos presenta una palabra nueva que es el this, esta palabra la usamos cuando tenemos igualdad de nombres en los atributos, así como se presento líneas arriba:
Cuando se da este caso es recomendable usar el this, para diferenciar correctamente, a la hora de utilizar esta palabra ponemos un punto y no saldrá opciones tal como se muestra:
Es de mucha utilidad esta palabra, ya que nos sirve como un buscador de atributos o métodos, si es que no recordamos el nombre de estos. Puede haber 3 formas de poder asignar estos atributos usando o sin usar la palabra this, recordando que esta palabra es una especie de buscador. El cual nos ayudara a diferenciar nuestros atributos de clase. FORMA 1: Cuando los atributos de la clase y del método son iguales:
FORMA 2: Utilizando el set. Aquí se puede utilizar el this de forma opcional. Observemos aquí después de la palabra set sigue el nombre del atributo de la clase pero en mayúscula, y aquí viene una nueva regla cada atributo o variable debe empezar siempre con letras minúsculas. Para evitar estos posibles errores se hace uso del this, después de poner un punto podemos llamar al setCodigo rápidamente de la siguiente forma: -6-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
this.setCodigo(codigo); FORMA 3: Cuando los atributos de la clase del método son distintos; en esta ocasión no es necesario utilizar el this. Pero nos puede servir como buscador.
El cual quedaría así: Las dos formas de asignar son validas. Aquí se puede observar mejor el orden en que se asigna las variables, en primer lugar va el atributo de la clase y luego el atributo del método,
.
PASO 5. Y por ultimo para terminar con esta clase padre, crearemos un método que contenga todas las impresiones de los atributos, esto se hace tal como sigue:
Por ultimo hay que hacer una observación que se puede utilizar el get o simplemente el nombre del atributo de la clase, o también ayudado del buscador this. Y con esto terminamos con la clase persona, los siguientes pasos se trataran de clase hijos el cual heredaran los atributos de la clase padre Persona.
PASO 6. Crearemos una clase hijo de nombre Alumno, el cual deberá heredar los atributos del padre.
Anteriormente se explico el uso de la palabra extends. Que se usa para heredar. No haremos nada más en esta clase hijo Alumno. Quedara así como se muestra. -7-
Universidad Tecnológica del Perú Lenguaje de Programación I
Aleksandr Paúl Quito Pérez Herencias
PASO 7. Como ultimo paso crearemos una clase Hprueba con método main para correr nuestra aplicación: Crearemos un objeto “a1” de la clase Alumno. Mucha atención aquí, que vamos a llamar a los atributos que Alumno heredo de la clase Persona.
Luego del objeto “a1” llamaremos al método que esta en el padre de la clase persona
Una ves asignados los datos correspondientes y llamando al método listar datos el cual nos permite imprimir los datos que queremos, nuestro código seria el siguiente:
Compilando tenemos lo siguiente:
Como podemos apreciar la clase hijo Alumno heredo todos los atributos de la clase padre Persona.
-8-