[MUSIC] Bien estoy en mi clase principal y a continuación veremos un ejercicio sobre herencia. Me encuentro en el método main, recuerda que necesitamos tener una clase que tenga por lo menos, bueno que tenga un método main. Por lo menos necesitamos tener una clase que contenga un método main, que será el método de entrada de nuestra aplicación. De acuerdo al ejercicio que vimos yo you he creado una clase playera y también una clase jeans y una clase calcetín. Cada una de estas clases tiene atributos. Por ejemplo a la clase playera le he credo id, precio, talla, color y corte, y respectivamente le he puesto también Getters y Setters. Además le he colocado el método mostrar datos, y aquí me imprime todos los datos de esta clase. De la misma forma, en la clase jeans también he colocado un id, precio, talla, color, corte, y además he agregado un atributo propio de esta clase que es género. La clase calcetin contiene el método id, precio, talla, color. También cada uno de estos atributos tiene su propio manejador de acceso a la información, sus getters y setters y también contiene el método mostrarDatos. La idea de la herencia es precisamente detectar todas estas cosas que están siendo redundantes en nuestro código, y que de alguna forma hace la lectura del mismo, pues un poco pesada. Entonces lo que haremos será integrar todas estas clases a una familia. Tal cual como lo platicamos en los vídeos anteriores. Haremos una familia de estas clases y para ellos crearemos una clase padre, donde detectaremos nuestros elementos redundantes y esos elementos redundantes se los asignaremos a la clase padre, para que él pueda heredárselos a estas clases hijo. Entonces, iré a mi proyecto, aquí donde está mi paquetito, y voy a crear una nueva clase. La clase se va llamar ropa. Esa será mi clase padre. Yo puedo definir, yo puedo abstraer, yo puedo analizar los elementos redundantes, por ejemplo, todos tienen en común el id, el precio, la talla, el color respectivamente con sus métodos. Y también, además el método mostrarDatos. Todos tienen en común también ese método. mostrarDatos para jeans y este acá abajo, mostraDatos para calcetín. Entonces voy a colocar aquí en mi clase padre, private. Yo coloque por acá arriba el id con un String lo vamos a cambiar. El id no debe ser String debe ser un entero, private int. Private, seguimos con el precio, lo podemos colocar como double. Precio. Después también podemos poner private talla, la talla si puede ser un String, talla. Podemos poner private color, y el color también puede ser un String. Color, aquí, listo. Y you, perfecto. you tenemos estos cuatro elementos, que son los elementos que detectamos que están en común. Vamos a crear también sus respectivos getters y setters. Voy a darle click derecho dentro de la clase, en la opción de source. Y donde dice generar Getters y Setters, seleccionaré todos los elementos y le daré okay. Perfecto. Además, voy a colocar también mi método mostrarDatos, mi método mostrarDatos en la clase padre. Public void mostrarDatos. Y yo puedo decir que mostarDatos, reciba a lo mejor un String del nombre de la clase. Porque detectamos que aquí lo primero que imprimimos es el nombre de la clase o el nombre de la prenda como tal. Entonces yo puedo recibir esto como un parámetro para estarlo poniendo. Y aquí mismo puedes incluir todos los Getters y Setters. Y aquí mismo incluir todas las impresiones de los atributos que yo tengo por acá. Voy a colocar aquí primeramente, imprimir el nombre de la clase. Luego imprimiré el id, el id de ese elemento, de esa clase. Seria bueno también imprimir, imprimiremos el precio, la talla, y el color. Tengo precio, aquí imprimimos el precio. Y por otro lado ponemos la talla, también, la talla la colocamos así y por último colocamos el color, el color lo concatenamos. you está. Entonces con esto yo you he creado una clase padre, you no necesito tener todas estas cosas por aquí. En primera el método mostrarDatos se va automáticamente de todas las clases, you no lo necesitamos. Se va de aquí. Listo se fue. Y también los atributos que detectamos, ¿no?, id, precio, talla y color los quitamos. En este caso Playera lo único que tendrá será el corte, entonces por lo tanto también me desharé de él. Todos los métodos que no tienen nada que ver aquí. De esta forma me quedo solamente con dos métodos y un atributo. Lo mismo haré para los Jeans, voy a quitar todos estos elementos, el corte el género. Estos son atributos. Que le corresponden solamente a esta clase, y como vamos observando el código se va haciendo más digerible. El código va minimizándose en gran manera, pero todavía no he terminado. Tengo Calcetin, le vamos a quitar todo a Calcetin. Porque la clase ropa you tiene todo, todos los atributos de calcetín. Como observas, hemos minimizado en gran manera el código. Y ahora, la idea de la herencia es, precisamente, todo esto, todo este código que está aquí, reutilizarlo en las demás clases. Para poder aplicar la herencia en una clase, como vimos en los vídeos anteriores, utilizamos la palabra reservada extends. Extends seguido de la súper clase o de la clase padre. En este caso mi clase padre es la clase Ropa. En este momento esta clase Playera. you tiene todos los atributos. Una playera you tiene un id. Una playera you tiene un precio, una talla y un color. Aunque no los veamos aquí en realidad están presentes. Por ejemplo si yo quiero desde el método set corte. Llamar no sé, get Id, imprimir el Id, puedo aquí llamarlo. Y como observas, también está aquí el color, el precio, la talla y aquí te dice exactamente de que clase pertenecen estos métodos. El método por ejemplo get id nos devuelve un entero y pertenece a la clase ropa. El método get corte, nos devuelve un string y pertenece a esta clase, a la clase playera. Aquí podríamos ir observando a qué clase pertenece cada método, yo podría hacer eso, y aunque yo no vea por aquí los métodos, en realidad es como si estuvieran gracias a la herencia. Entonces voy a quitar ésto, lo mismo sucederá con los atributos, recuerda que esto va a depender del modificador de acceso que tenga cada elemento. Podemos traernos los elementos públicos y los elementos protected. Pero los elementos private y default, esos no pueden ser accesibles en la herencia. Si yo por ejemplo, en la clase ropa declaro un elemento público, no sé, string, le pongo nombre. Puedo yo, desde aquí Accesar al nombre y como observas aquí aparece el atributo nombre como si estuviese declarado aquí. De hecho yo pongo una c, aquí, para por ejemplo poder accesar al corte y aquí me dice que está en esta clase. Yo puedo poner aquí nombre y me dice que es un string y pertenece a la clase ropa. Pero los demás atributos no los veo, porque los otros atributos están definidos como privados. Es decir, una característica de este modificador de acceso es que los privado solamente son accesibles para esa clase. No para clases que hereden de ellas, ni clases que estén en otro paquete, etcétera. Éste es el más restrictivo. Entonces, de esta forma you estoy utilizando la herencia y estoy ahorrando mucho código. Yo podría definir un método constructor como lo vimos en los ejercicios anteriores del teléfono. Yo podría definir un método constructor, por ejemplo ropa. Y yo podría decir para que como mínimo, yo podría decir que, para que un objeto de tipo ropa puede ser creado, necesito como mínimo tener los siguientes parámetros, por ejemplo, que tenga un id, que tenga un precio asignado, y que también tenga nada más. Por ejemplo, vamos a decir, por poner uno más, una talla y, bueno, podemos decir que sean todos obligatorios, ¿no? Que sean todos los elementos obligatorios para que yo pueda crear un elemento de tipo ropa y, aquí puedo colocar this, le digo id. This lo utilizo mucho cuando tengo variables que tienen el mismo nombre, como observas aquí estoy devolviendo el id, que es esta variable. Y aquí también, estoy accesando el id que esta variable. Ésta anotación y ésta, son equivalentes. En realidad me trae el mismo valor, yo también aquí podría tener this, así, y no hay ningún problema. Pero es muy común utilizar this cuando tengo elementos, por ejemplo, this este id, es una variable global y este id es una variable local, entonces ambas variables tienen el mismo nombre. Puedo utilizar this para referirme a mi variable global y puedo utilizar, simplemente sin this, para referirme a la variable local. Entonces con this me estaré refiriendo a todos los elementos que están en la clase, como te lo expliqué en las sesiones anteriores. Todos nuestros elementos que está contenidos en esta clase, los acceso a través de this. Me falta aquí el color. Entonces, lo que yo estoy haciendo aquí, es que al momento de que creemos un objeto de tipo ropa. Automáticamente, todas estas variables se inicializarán. Con lo que una persona le pase aquí, eso lo vimos muy bien explicado en nuestra clase de teléfono, cuando vimos el método constructor. Ahora, seguimos por acá a la playera. ¿Qué nos está diciendo?, dice que necesitamos también añadir un constructor. Como yo you estoy aplicando la herencia de ropa, dice que necesitamos añadir un constructor que tenga la misma forma de su clase padre, su clase ropa. Lo añado y me añade un constructor con estos mismo elementos. Entonces lo que yo estoy haciendo aquí es sobreescribiendo este constructor en mi clase hija. Y ahora puedes ver nuestras palabras claves, que platicamos en una sesión anterior. Que vimos this y esta nueva que es super. Yo puedo decir, que para crear una playera necesito el id, sí, necesito el precio, también, la talla, por supuesto, el color, claro. Y además necesito que me indiques el corte, yo puedo añadir aquí, corte. Y entonces, desde el momento en el que yo empiezo a implementar código en un método que estoy sobreescribiendo. En un método que estoy heredando, en este caso el método constructor. En este momento you estoy sobreescribiendo el método, y en ese momento cuando sobreescribimos y le damos implementación, estamos viendo presente el polimorfismo. Porque ese método se está comportando de diferentes formas. Entonces con super me estoy refiriendo a la clase padre, la súper clase. Super siempre se referirá a la súper clase. Por lo tanto aquí me estoy refiriendo. Al método constructor de la clase padre. La clase padre ropa tiene esta definición, id, precio, talla y color. Con super estoy pasando los mismos parámetros, id, precio, talla y color. Esto equivaldría como si tuviese ropa, así no sé si se pudiera ver de una forma. Pero lo ejemplifico con super, cuando yo pongo super, y le pongo punto, puedo tener acceso a todos los métodos de la clase padre. Como observas está por aquí getColor, getColor es un método que no está presente en Playera. GetPrecio también es un método que no está presente en Playera. Y puedo traérmelos así y estarlos llamando sin problema. También podría traerlo sin la palabra super, y ambos equivalen a lo mismo. Pero con super, indico que me refiero a todos los componentes de la clase padre. Con este super sin punto, me estoy refiriendo al método constructor de la clase padre. Bien, seguramente viste aquí en super, cuando le di punto, viste por acá estos que dicen Object- Object, Ropa, Ropa ,Object, etc. Y es que por regla, por regla general, automáticamente todos los métodos, automáticamente todas las clases sin que lo indiques, siquiera. Todas las clases se heredan de la clase padre object. En Java existe la clase padre Object y, automáticamente, todas las clases van a heredar de ella. Sin nosotros siquiera indicarlo con la palabra reservada extends. Si voy por aquí estoy aquí en mi clase Object, aquí está la clase Object. Tiene muchos métodos, tiene muchos atributos y cuando yo creo un objeto, cuando yo creo una clase o un objeto automáticamente. Los métodos de la clase Object estarán presentes, estarán visibles. Entonces de esta forma yo puedo de una forma sencilla estar ahorrando código. Voy aplicar la herencia también en Jeans, Ropa. Voy a definir el constructor también para Jeans, y también en Jeans tengo dos atributos adicionales. Corte, vamos a poner String corte y char genero char género, y también pasárselos respectivamente. Corte, le pasamos el corte. Y this.genero, le pasamos el género. Ahora el calcetín. Calcetín pues no tienen ninguno. Entonces podría yo nada mas aquí aplicar la herencia para Ropa, you está y coloco un constructor igualito. No necesito añadirle más comportamiento a Calcetin, al constructor de Calcetin. Ahora me falta el método mostrar datos. Porque cuando yo llame el mostrar datos de Playera, solamente me imprimirá el id, el precio, la talla y el color. E ignorarán el corte, el corte que es un atributo que yo agregué para Playera. Entonces lo que haré será sobreescribir ese método, sobreescribir en el método mostrarDatos. Puedes sobreescribirlo simplemente colocando una palabra clave, mos de mostrar, y das ctrl barra espaciadora. Y nos aparece aquí. O también otra opción es dando click derecho en Source en la opción de Override/Implement Methods. Y yo aquí puedo ver todos los métodos que tengo disponibles para sobrescribir. Por ejemplo el método mostrar datos, ese es el que quiero. Y además los métodos de la clase Object. También los puedo sobreescribir, y también puedo darles una implementación personalizada. Voy a traer ese, y como observas, super también está haciendo referencia al método mostrar datos. Pero de la super clase. Yo aquí nada más, me faltaría añadir el Corte y colocar aquí el Corte. Entonces con esto yo estoy indicando que se ejecute todo lo que está dentro de mostrarDatos. Y adicional, ejecuta ésto. Yo podría también quitar esto. Podría quitarlo, pero solamente estaría implementando, estaría mostrando el corte, no estaría mostrando todos los demás. Para fines de este ejercicio, Pues voy a dejar esto. Entonces aquí también vemos el polimorfismo, en mostrar datos. Estoy sobreescribiendo este método y estoy añadiéndole un nuevo comportamiento. Puedo aplicar lo mismo para los demás, mostrar datos y agregar los elementos que me faltan. Me falta para los Jeans, me falta el Corte y también me falta el Género. Colocamos aquí Genero: y concatenamos el Genero. Listo, y para Calcetin. También podría traer sobreescribir, mostrar datos y para Calcetin, pues no tengo ningún atributo adicional. Entonces, podría ahorrarme la sobreescritura en este caso, porque Calcetin se va a comportar de la misma forma con como ropa. Entonces vemos ,como en el caso de nuestra vida real. Cuando nosotros heredamos características de nuestros abuelos o heredamos características a nuestros hijos. Algunos, algunas características si podemos tenerlas y otras no como tal. Algunas características podríamos. Incluso añadirlas, tenerlas presentas, pero a lo mejor en una forma distinta. A lo mejor yo podría tener el cabello ondulado, y mi hija podría tener el cabello ondulado sí, pero menos ondulado, o con una ondulación distinta. Ahí podríamos haber aplicado el polimorfismo. Entonces, de esta forma es como nosotros podemos trabajar la herencia. Y, por último, nada más me faltaría pues probar, probar mis clases. Puedo crear una playera Playera. vamos a ponerla igual a new y yo puedo decir que tenga un id 1, a un precio de 299.5, una talla que sea, puedo definir chica. Un color, puedo decir que sea gris, y un corte, puedo decir que sea de tipo polo. Esa es una Playera. Y ahora, para unos jeans, puedo colocar unos jeans. New jeans, también le coloco un Id por ejemplo el Id dos. Puedo colocarle un precio, un precio para unos jeans podemos decir que sean 799. Una talla que sea, una talla, 32. Un color, podemos decir que sea color azul. Para el corte de unos jeans podemos tener skinny y el género podemos decir que sea femenino. Género femenino. Ahora por último, nos falta un calcetín. Un calcetín. Podríamos poner igual a new. Y lo mismo podría tener el id tres. Unos calcetines que podrían ser unos 29. Una talla podríamos poner talla m. Color podríamos decir que sean rojos. Aquí ponemos punto y coma, listo, no olvides siempre los punto y coma, son muy importantes en java. Bien, you he creado estos objetos, el objeto playera, el objeto jeans, el objeto calcetín. Y cada uno tiene su mínimo de atributos para ser recreado. Ahora vamos a poner en práctica ésto, vamos a decir playera.mostrarDatos, y le decimos que es una playera, una playera gris. Ahora vamos a jeans.mostrarDatos y le decimos que son unos jeans, azul, unos jeans de mujer. Y calcetin.mostrarDatos, podemos decir que sea aquí calcetines. Calcetines, perfecto. Ahora, si corremos ésto, ¿qué nos aparecerá? Pues todo lo que acabamos hacer, todo nuestro trabajo con la herencia. you tenemos un id, el precio, la talla, el color, para una playera gris de mujer. Precio, talla, color para los jeans de una mujer. También los calcetines, precio, talla y color. Como observas en cada uno con su método mostrar datos lo personalizó a su gusto. Entonces aquí vemos aplicado el polimorfismo. Bien, hemos visto varios conceptos. Hemos visto herencia sobreescritura de métodos y polimorfismo. Hemos visto también nuestras palabras reservadas super, que hace referencia a la súper clase, y this que hace referencia a la clase donde estás ubicado. Nos vemos en el siguiente. [MUSIC]