[MUSIC] Hola amigos, bienvenidos a esta sesión donde estaremos platicando sobre la herencia en la programación orientada a objetos. Recuerda que en la programación orientada a objetos lo que se planea es tratar de modelar cuestiones de la vida real y pasarlos a código, a software. Generalmente la mayoría de los software llegan a ser un poco complicados en construirse. Precisamente la programación orientada a objetos nos ayuda a modelar esas situaciones de la vida real, esos escenarios de nuestra vida real, tratarlas de pasar a código de la forma más sencilla posible. Precisamente uno de estos temas que nos ayudan a poder pasar cosas de la vida real, a transformarlas a código de una forma súper sencilla es la herencia. Podemos ver la herencia en muchas facetas de nuestra vida por ejemplo, yo podría tener mi abuelo, y también podría tener por ejemplo hijos. Yo podría tener algunas características que tiene mi abuelo, podría heredarlas, el color de ojos, la forma del cabello, el tono de piel, etc. Y así mismo, podría de alguna una forma, digamos reutilizar, esas características, y dárselas también a mis hijos. Algunos podrían tenerlas y otros no. Esos son algunos de los detalles que también veremos en la herencia. Mis hijos, algunos de mis hijos podrían tener el color de ojos también o podrían tener incluso la misma forma del cabello. Justamente así también es como trabajamos en la herencia con código. Básicamente tomaremos una clase, tendremos también una clase padre y una clase hijo. Tomaremos la clase padre. Esa clase padre tendrá definidos atributos, comportamientos, etc, etc. Y esa clase padre podrá heredárselas a una clase hijo. La clase hijo podrá decidir si tomar todas las características o no. Y también esa clase hija, podría heredárselas a nuevas clases hijas. De esta forma, es como vamos viendo una jerarquía en el código. La herencia nos ayuda a reutilizar código, a reutilizar características, y también comportamientos. [MUSIC] Podemos realizar un ejercicio para ver si tenemos presente herencia de nuestro código. Por ejemplo puedes ver. Tenemos estas tres clases, tenemos la clase playera, tenemos la clase calcetines y tenemos la clase jeans. Como observas estas tres clases tienen algunos atributos en común. Y en contexto de Getters y Setters comparten también estos métodos. Por ejemplo getId, getPrecio, getTalla y getColor. Adicional cada clase tiene algunos atributos propios de ella. Es decir, hacer una familia con estas clases, de tal forma que puedan compartir entre ellas estos atributos y estos métodos. Tenemos el método getId, el getPrecio, getTalla y getColor son métodos que están presentes y que todas los tienen en común. También el método mostrar datos. De esta forma, podemos hacer una clase padre que contenga todos estos métodos y atributos. Y así pueda heredarlos a sus clases hijas. Y de esta forma, podemos estar reutilizando código. Como se ve, tenemos la clase padre ropa. Ésta será nuestra súper clase. Y todas las clases hijas, como por ejemplo la que está aquí que es playera, será nuestra subclase, o clase hija. En términos de código, podemos tener lo siguiente. Podemos tener public class Ropa y esa será nuestra clase padre o súper clase. Y posteriormente tenemos public class Playera y para incluir la herencia en esta clase utilizamos la palabra reservada extends, public class Playera extends Ropa. Y automáticamente, todos los métodos y atributos que tiene la clase ropa, serán heredados a nuestra clase hija, nuestra subclase playera. Cuando utilicemos la herencia en nuestro código, habrá dos palabras muy importantes, que son muy comunes utilizar en la herencia. La primera es super y también this. De esta forma hacemos esa diferencia con this todos los elementos de esta clase, de la clase en la que estoy ubicado. Y con super todos los elementos de mi súper clase, de mi clase padre. Recordando la idea de la herencia, es tener algunos métodos generales en nuestra clase padre y posteriormente tener la posibilidad de heredarlos a nuestras clases hijas. Bueno, con solamente heredarlos y que estén ahí, no es suficiente a veces necesitamos dar nuevas implementaciones a esos elementos o darles otro comportamiento. Cuando nosotros implementamos un método y le añadimos comportamiento o le añadimos código, es decir, implementamos el método con nuevo código. A eso se le llama sobre escritura de métodos. Algo que es muy importante decir es que no puedes sobre escribir todos los métodos de una clase padre. Por ejemplo, los métodos marcados como finales, osea final, o como estáticos, osea con la palabra reservada static. Estos no los podemos sobre escribir, estos se conservan en la clase padre. Recuerdas que a parte de nuestros métodos comunes, tenemos también nuestros métodos constructores, ¿pues adivina qué? Estos también se pueden sobre escribir y a ésto se le llama sobreescritura de constructores, y básicamente lo que estás aquí implementando es la creación de una clase hijo a partir de una clase padre. Es decir, yo estaré sobrescribiendo el método constructor de mi clase padre, en mi clase hijo. Y de esta forma tendré una nueva clase hijo a partir de la clase padre. [MUSIC] Muchas formas, siempre que yo sobrescribo un método, es decir, siempre que yo implemento un nuevo código, en ese método heredado, este método se comportará de una forma diferente. Es decir, voy a tener un mismo método con diferentes comportamientos y cuando tengo diferentes comportamientos de una sola cosa a eso se le llama Polimorfismo. Polimorfismo quiere decir muchas formas. Eso es lo que sucede cuando nosotros sobreescribimos un método, el método ahora tiene muchas formas de comportarse. [MUSIC]