Lección 9 – Herencia, Polimorfismo y Encapsulamiento en Java

Curso: Programación Orientada a Objetos

En esta lección pondremos a practica estos pilares de la Programación Orientada a Objetos que son la Herencia, el Polimorfismo y el Encapsulamiento que su significado más a detalle de cada una la encontramos en lecciones anteriores.

Herencia en Java

La Herencia en Programación Orientada a Objetos es parecida al concepto de Herencia en la vida real donde se basa en genética, en descendientes, igual en Programación la Herencia comparte muchas características de dicha Clase, donde la clase que deriva de la principal se llama subclase y puede contener atributos y métodos que no existan en la clase principal, es como en la vida real, un Hijo puede parecerse a su Papa, pero el Hijo puede tener otras características que el Papa no tiene.

Para empezar a poner en practica la Herencia es evidente que necesitamos más de una Clase si no no tendría sentido, así que vamos a crear una nueva Clase llamada Deudor, que asimilara a un Cliente Deudor que debe dinero, creamos la Clase en el mismo Package que la lección anterior, si no sabes como crear una Clase, regresa a lecciones anteriores para ver la explicación.

Antes de crear esta Clase es necesario tener un constructor vacío (sin atributos) en nuestra Clase Cliente (la clase que va a heredar los atributos y métodos) para que lo detecte a la hora de hacer la Herencia. Si no sabes como hacer un constructor regresa a lecciones anteriores para aprender a crear constructores.

Una vez creado el constructor vacío en nuestra Clase que heredará los atributos vamos a crear una nueva Clase llamada Deudor y quedaría así:

Para hacer que esta Clase tenga los atributos que le heredará la Clase Cliente es necesario colocar un método en la misma línea de código donde se crea la Clase, este método se llama “extends” y lo agregaremos después del nombre de esa Clase y en seguida colocaremos el nombre de la Clase que vaya a heredar sus atributos, en este caso yo quiero que la Clase Cliente herede sus atributos a la Clase Deudor.

Una vez tengamos conectada la Clase que heredará sus atributos a nuestra Clase vamos a crear nuevos atributos para que se distinga de las demás Clases.

Una vez creado nuestros atributos únicos de esa Clase vamos a crear dos constructores de la misma manera de en las lecciones anteriores, uno vacío, es decir sin atributos y otro con nuestros atributos.

Vemos que se crea el constructor con los atributos igual que en las lecciones anteriores, pero ahora este tiene una sentencia adicional que inicia con una palabra reservada o keyword llamado “super” y en paréntesis los atributos de la Clase que heredó sus atributos a esta. Y pues están los this.nombreAtributo = nombreAtributo; que normalmente conocemos que la palabra “this” indica que el atributo está ahí como tal.

Ahora vamos a nuestra Clase Principal Main a usar esta Clase con Herencia. Primero creamos nuestro objeto de la Clase Deudor, por ejemplo, yo creare un objeto sin valor en sus atributos ya que en esta ocasión usaremos la librería java.util.Scanner para que el usuario pueda darle valor a esos atributos, entonces, creare un objeto llamado deudor1 sin atributos.

Una vez que tengamos nuestro objeto creado vamos a importar la librería java.util.Scanner, las librerías siempre se colocan hasta arriba, debajo del Package como verán. Y recuerden que tienen que agregar la sentencia Scanner leer = new Scanner (System.in); para poder así leer lo que escribe el usuario.

Debajo de nuestro objeto empezaremos a pedirle los datos al Usuario con System.out.println(“”); y para poder guardar ese dato en un atributo especifico lo hacemos colocando primero el nombre de nuestro objeto que hemos creado, enseguida colocaremos un punto y luego el atributo que queramos, podemos usar atributos de la Clase Cliente (Clase Padre) y atributos de la Clase Deudor (Clase Hija). Luego colocaremos un igual y la sentencia de la librería Scanner, leer.next(); esto es en caso de que el tipo de dato del atributo sea String, porque si fuera Int, la sentencia quedaría leer.nextInt();

Entonces le pediremos los datos al Usuario para que este vaya tecleándolos usando atributos de ambas Clases y al final mostraremos esos datos.

Polimorfismo en Java

El Polimorfismo mucha gente la llega a confundir con la Herencia ya que tiene un pequeño parecido debido a los atributos, la principal diferencia es que el Polimorfismo solo tiene atributos en común, es decir, no tiene todos los atributos, como en el caso de Herencia que aquí la clase Hija si tiene todos sus atributos. Algo que es sorprendente del Polimorfismo es que este puede mezclar datos de cualquier tipo, cosa que no se podía en Java. Llega a ser algo confuso, pero poniéndolo en práctica seguro lo entiendes.

Nos ubicamos en la clase Main y empezaremos a crear un Vector, un Vector es una zona donde se almacena datos del mismo tipo, por ejemplo, puedo guardar solo datos del tipo String pero no puedo guardar otro tipo de dato en el mismo Vector ya que nos daría un error. Así que vamos a crear uno especial, vamos a crear un Vector del tipo de dato Cliente, así es no será String, ni Int, ni ningún otro tipo de dato conocido, para ello tendremos que colocar primero el nombre de nuestra clase Padre, en mi caso se llama Cliente, que es de donde derivan las demás, y luego colocaremos el nombre de nuestro Vector junto con corchetes, igual a new y de nuevo el nombre de nuestra Clase Padre y también corchetes, pero dentro de los corchetes tendrán que colocar la longitud de este, recuerden que los Vectores inician desde la posición 0. Yo le colocare un 3 ya que quiero que tenga 3 posiciones, del 0 al 2 son tres posiciones.

Ya que tengamos establecido nuestro Vector es hora de llenarlo con datos del mismo tipo, en este caso datos del tipo Cliente. Para ello usamos el espacio de la posición 0 y le asignamos un nuevo tipo de dato Cliente.

Ahora le asignaremos valores en las demás posiciones, pero usando otros tipos de datos, en este caso le asignaremos del tipo de dato Deudor.

¡Sorpresa! No nos regresa ningún tipo de error, esto se debe al Polimorfismo, como Cliente es la Clase Padre y Deudor es Clase Hija por ese motivo el polimorfismo en Java dice que podemos guardar cualquier tipo de dato solo que sean Clases Hijas. Igualmente, con los objetos, podemos tener 2 objetos, uno de la Clase Cliente y otro de la Clase Deudor y le asignamos el objeto de la Clase Cliente (padre) al objeto de la Clase Deudor (hija) no nos dará ningún tipo de error, sin embargo, lo hacemos al revés si es donde nos dará error. Espero te haya quedado claro el tema de Polimorfismo con este ejemplo dentro de Java.

Encapsulamiento en Java

El Encapsulamiento como en lecciones anteriores lo vimos, significa juntar elementos y cambiar el tipo acceso, como los niveles public, protected y privated. Este tema para muchos es el más sencillo de trabajar ya que es algo lógico, pero se debe tomar en cuenta según el contexto del programa.

Nos ubicamos en la Clase Cliente (Clase Padre) y nos ubicamos en donde está el constructor vacío, y notamos la palabra public, es decir, el modificador de acceso, que en lecciones anteriores lo usamos mucho pero ahorita con el Encapsulamiento te quedará claro.

Ahora si cambiamos el modificador de acceso public por otro, que en si vimos los tres tipos de niveles de modificador de acceso (public, private, protected), entonces cambiamos public por private y en seguida nos dará un error en las demás Clases donde hemos utilizado esta Clase.



Y esto se debe a que el nivel private, que quiere decir protegido, esta protegido y no puede usarse en las demás Clases, por eso ocasiona un error ya que estamos utilizando esta Clase en las demás y no la detecta.

Esto es el Encapsulamiento, al igual que con los con métodos también podemos usarlo con variables, generalmente siempre al declarar una variable solo escribimos el tipo de dato y el nombre de la variable, pero también podemos usar un modificador de acceso, nos ubicamos en nuestra Clase Padre y antes de escribir el tipo de dato de una variable escribimos cualquier tipo de nivel de acceso, en este caso les pondré un modificador de acceso a los atributos de la Clase Padre.

¡Listo! Ya hemos aplicado 3 pilares de la Programación Orientada a Objetos en código fuente, con el lenguaje de programación Java, te espera la última lección donde crearemos una interfaz. No olvides que la práctica hace al maestro, saludos.