1 00:00:06,940 --> 00:00:17,719 En este segundo vídeo de programación orientada a objetos vamos a ver la parte de la implementación del ejemplo que habíamos estado viendo en el vídeo anterior. 2 00:00:18,179 --> 00:00:32,619 Si recordáis lo que habíamos visto es que teníamos una clase figura de la cual van a extender o van a heredar las clases cubo, esfera y paralelepípedo y cada una de estas va a tener una implementación. 3 00:00:33,380 --> 00:00:40,939 Para hacer este desarrollo en Java nosotros hemos planteado el desarrollo mediante cinco clases. 4 00:00:41,140 --> 00:00:51,020 Una clase que va a ser la principal, después vamos a tener la clase figura que va a contener solamente la implementación de esta clase padre 5 00:00:51,020 --> 00:00:59,700 y después las clases hija, cubo, esfera y parálide de epípedo que también va a tener una implementación cada una de ellas. 6 00:00:59,700 --> 00:01:15,519 Empezamos con la clase figura y dentro de la clase figura, si os fijáis, tenemos el nombre y el color 7 00:01:15,519 --> 00:01:19,640 que eran los atributos que va a compartir con el resto de las clases 8 00:01:19,640 --> 00:01:23,959 y los métodos área y volumen que los tengo por aquí abajo 9 00:01:23,959 --> 00:01:29,719 Cosas interesantes que tiene una clase, pues bueno, en primer lugar tiene un constructor 10 00:01:29,719 --> 00:01:36,959 el constructor es digamos un elemento que tiene que tener el mismo nombre que la clase 11 00:01:36,959 --> 00:01:40,719 veis que aquí se llama CLS figura y aquí aparece CLS figura 12 00:01:40,719 --> 00:01:46,959 y tiene pues los datos de inicialización de esta clase 13 00:01:46,959 --> 00:01:51,180 en este caso como la clase figura tiene un nombre y un color 14 00:01:51,180 --> 00:01:54,459 pues como parámetros se le pasan ese nombre y ese color 15 00:01:54,459 --> 00:01:59,780 para hacer referencia a los atributos de la clase se utiliza el operador dis 16 00:01:59,780 --> 00:02:05,180 así que al hacer por ejemplo esta asignación dis.nombre 17 00:02:05,180 --> 00:02:07,719 está haciendo referencia a este nombre de aquí 18 00:02:07,719 --> 00:02:11,860 y este nombre de aquí está haciendo referencia al valor que le pasamos 19 00:02:11,860 --> 00:02:14,699 lo mismo ocurre con dis.color 20 00:02:14,699 --> 00:02:17,960 este dis.color hace referencia al atributo de la clase 21 00:02:17,960 --> 00:02:23,020 y este color hace referencia al valor que le pase el usuario 22 00:02:23,020 --> 00:02:29,340 que esté usando la aplicación a este valor de aquí, así que aquí lo que está haciendo este constructor 23 00:02:29,340 --> 00:02:37,039 y lo que hacen en general todos los constructores es una inicialización de la clase que estamos instanciando 24 00:02:37,039 --> 00:02:44,539 ese constructor es llamado desde el programa principal cuando se haga la operación new 25 00:02:44,539 --> 00:02:49,259 que es para crear un nuevo objeto de una clase o una nueva instancia de una clase 26 00:02:49,259 --> 00:02:53,699 adicionalmente tenemos estos dos tipos de métodos 27 00:02:53,699 --> 00:02:58,960 esto es un método getter y esto es un método 28 00:02:58,960 --> 00:03:02,800 bueno en este caso son los dos métodos getter 29 00:03:02,800 --> 00:03:06,639 lo que hacen este es obtener el nombre y este obtener el color 30 00:03:06,639 --> 00:03:10,900 cuando hacemos un método getter lo que estamos haciendo 31 00:03:10,900 --> 00:03:16,139 es obtener el valor de alguno o de varios atributos de la clase 32 00:03:16,139 --> 00:03:18,819 en este caso obtener nombre está haciendo un getter 33 00:03:18,819 --> 00:03:23,680 de this.nombre, es decir, del valor que tenga nombre para ese objeto 34 00:03:23,680 --> 00:03:28,379 y this.color para el valor que tenga el color para ese objeto 35 00:03:28,379 --> 00:03:34,740 estos de aquí se llaman métodos getter porque lo que hacen es obtener el valor de una clase 36 00:03:34,740 --> 00:03:40,840 si lo que hiciesen fuese establecer el valor de estos atributos 37 00:03:40,840 --> 00:03:44,280 pues serían métodos setter 38 00:03:44,280 --> 00:04:03,240 Bien, alguien se podrá preguntar para qué se utilizan métodos setter, si ya tenemos aquí un inicializador o un constructor. Pues bien, eso se hace porque el constructor permite inicializar los objetos en el momento de su creación, estos atributos en el momento en el que se crean. 39 00:04:03,240 --> 00:04:12,620 Una vez que el objeto ya está creado, la única forma de poder modificar los valores de sus atributos es mediante métodos getter, ¿vale? 40 00:04:12,639 --> 00:04:15,800 Lo veremos en los ejemplos que tenemos a continuación. 41 00:04:16,860 --> 00:04:22,500 La segunda clase que vamos a implementar es la clase cubo. 42 00:04:22,839 --> 00:04:32,459 Hay que tener en cuenta que en la clase anterior, si vamos a la clase anterior, la clase figura, fijaos que la sintaxis es public class CLS figura. 43 00:04:32,459 --> 00:04:44,540 Sin embargo, en la clase cubo, la sintaxis es public class CLS cubo extend figura, que significa que hereda de la clase figura. 44 00:04:44,920 --> 00:04:53,240 Al hacer esto en la sintaxis, automáticamente los métodos y los atributos de la clase padre son heredados. 45 00:04:53,240 --> 00:05:01,240 De tal forma que si veis aquí ni siquiera se tienen que declarar ya el método nombre, las propiedades nombre y color 46 00:05:01,240 --> 00:05:08,040 Porque ya al hacer el extend de figura se supone que están heredados 47 00:05:08,040 --> 00:05:10,699 Y esto se demuestra en el siguiente constructor 48 00:05:10,699 --> 00:05:18,939 Si veis el constructor de la clase cubo, lo que se le pasa es el lado, que es este de aquí, y el nombre y el color 49 00:05:18,939 --> 00:05:21,819 Y alguien dirá, pero si el nombre y el color no lo tenemos aquí 50 00:05:21,819 --> 00:05:25,699 efectivamente, pero como están heredados de la clase figura 51 00:05:25,699 --> 00:05:28,759 nosotros se lo podemos pasar en la inicialización 52 00:05:28,759 --> 00:05:33,839 para poder inicializar el nombre y el color de la clase de la que hereda 53 00:05:33,839 --> 00:05:36,420 nosotros tenemos que hacer una llamada a super 54 00:05:36,420 --> 00:05:41,379 con super lo que estamos haciendo es llamar al método constructor 55 00:05:41,379 --> 00:05:45,319 de la clase padre, es decir, en esta instrucción de aquí 56 00:05:45,319 --> 00:05:49,980 le pasamos a la clase figura el valor del nombre 57 00:05:49,980 --> 00:06:03,720 y el valor de color que nos pase el usuario en la construcción del cubo, ¿vale? De modo que al hacer aquí este super nombre y color realmente estaremos ejecutando este constructor de la clase figura. 58 00:06:04,819 --> 00:06:18,139 El lado pues funciona ya igual que en la clase figura, se hace dispuntolado, hace referencia a este atributo y lado al valor que proporciona aquí el usuario para la construcción del cubo. 59 00:06:18,139 --> 00:06:22,860 a continuación aquí sí que tenemos métodos getter y setter 60 00:06:22,860 --> 00:06:26,360 en este caso para la obtención o modificación del lado 61 00:06:26,360 --> 00:06:28,139 en el caso de que hagamos un setter 62 00:06:28,139 --> 00:06:31,199 lo que podemos hacer es cambiar el lado del cubo 63 00:06:31,199 --> 00:06:33,160 porque si el lado del cubo cambia 64 00:06:33,160 --> 00:06:39,360 puedo tener distintos parámetros a la hora del cálculo 65 00:06:39,360 --> 00:06:43,139 así de esta forma al hacer el set lado 66 00:06:43,139 --> 00:06:45,699 le paso el lado y modifico 67 00:06:45,699 --> 00:06:47,500 igual que hace el constructor 68 00:06:47,500 --> 00:06:56,959 modifico el valor del lado como atributo de la clase y en getLado veis que no se le pasan parámetros 69 00:06:56,959 --> 00:07:04,680 porque lo que hace es obtener, es decir envía a la persona que se lo diga o al programa que se lo diga el valor de ese lado 70 00:07:04,680 --> 00:07:13,459 y otras cosas muy importantes son la sobrescritura de los dos métodos área y volumen 71 00:07:13,459 --> 00:07:29,220 Si recordáis, vamos a ir otra vez a la clase figura, estos dos métodos, el área y el volumen, pertenecen a la clase figura, pero como el cubo extiende de esta clase, pues estos métodos son heredados. 72 00:07:29,220 --> 00:07:49,259 ¿Qué pasa? Que estos métodos en sí mismos devolverían un valor cero, pero como aquí están sobrescritos, cuando nosotros hagamos referencia al área de la clase cubo, el método que se ejecutará es el cálculo del área del cubo y lo mismo ocurrirá con el cálculo del volumen. 73 00:07:49,259 --> 00:08:04,759 Se ejecutará este método de aquí. La cláusula arroba overwrite es necesaria porque si no, este método no podría ser sobrescrito cuando son invocados desde la clase cubo. 74 00:08:04,759 --> 00:08:20,759 La siguiente clase que vamos a ver es la clase esfera que ya sabiendo un poco la mecánica de la clase cubo pues es muy parecida o similar. En este caso la clase esfera extiende o hereda de la clase figura. 75 00:08:20,759 --> 00:08:25,300 como atributo adicional se le pone el radio 76 00:08:25,300 --> 00:08:29,240 aquí en el constructor de la clase esfera 77 00:08:29,240 --> 00:08:33,019 pues se invoca al super 78 00:08:33,019 --> 00:08:38,700 al padre para pasarle el nombre de la esfera 79 00:08:38,700 --> 00:08:39,820 y el color de la esfera 80 00:08:39,820 --> 00:08:42,720 y el radio que es propio de esta clase 81 00:08:42,720 --> 00:08:45,820 aquí también tendremos métodos setter y getter 82 00:08:45,820 --> 00:08:50,299 para poder establecer un nuevo valor de radio 83 00:08:50,299 --> 00:08:52,759 para obtener el valor de radio que tenga actualmente 84 00:08:52,759 --> 00:08:56,480 y la sobrescritura de los métodos del área y del volumen 85 00:08:56,480 --> 00:09:00,679 para poder realizar esos cálculos 86 00:09:00,679 --> 00:09:03,220 como veis también tienen que estar sobrescritos 87 00:09:03,220 --> 00:09:07,940 para que cuando nosotros hagamos referencia a este método 88 00:09:07,940 --> 00:09:10,919 al método área sea distinto 89 00:09:10,919 --> 00:09:13,580 en el caso de que sea llamado desde un cubo 90 00:09:13,580 --> 00:09:18,539 o desde una esfera 91 00:09:18,539 --> 00:09:25,480 y bueno visto ya la clase esfera pues la clase paralel epípedo es exactamente igual 92 00:09:25,480 --> 00:09:29,759 lo único es que tiene más atributos este también extiende de la clase figura 93 00:09:29,759 --> 00:09:33,860 tiene sus atributos el constructor también llama super con el nombre y el color 94 00:09:33,860 --> 00:09:42,139 y tiene sus métodos setter y getter para la obtención o establecimiento de los atributos o de sus valores 95 00:09:42,139 --> 00:09:53,360 El cálculo del área y el cálculo del volumen es igual, pero estableciendo los parámetros necesarios para la sobrescritura de este método. 96 00:09:56,019 --> 00:10:05,559 Si vamos al código en NetBeans, vamos a ver cómo está realizada esta implementación. 97 00:10:05,559 --> 00:10:12,980 dentro de NetBeans si nos fijamos en las pestañas que tenemos aquí creadas o aquí en la parte izquierda 98 00:10:12,980 --> 00:10:19,320 vemos que tenemos un programa principal, la clase figura, la clase cubo, esfera y para el epípedo 99 00:10:19,320 --> 00:10:23,480 y básicamente están creadas tal y como las hemos explicado en el ejemplo 100 00:10:23,480 --> 00:10:30,879 el programa principal lo vamos a dejar para el final y estas cuatro clases están implementadas tal cual 101 00:10:30,879 --> 00:10:35,240 están en el ejemplo que hemos visto en las diapositivas 102 00:10:35,240 --> 00:10:43,840 si os fijáis, la creación de la clase empieza aquí, public class figura hasta la clase padre con sus atributos 103 00:10:43,840 --> 00:10:49,639 aquí ya tienen tipeados los valores de los atributos de tipo string 104 00:10:49,639 --> 00:10:55,340 aquí tenemos el constructor que veis que se hace exactamente igual a como lo hemos visto en el ejemplo 105 00:10:55,340 --> 00:11:03,100 y los métodos getter para el nombre y el color de la figura geométrica que estemos utilizando 106 00:11:03,100 --> 00:11:15,919 El cálculo del área y del volumen estarán establecidos a cero porque desde aquí nunca van a ser llamados ya que solamente los necesitamos para que las clases hijas los hereden. 107 00:11:15,919 --> 00:11:36,860 La clase cubo, por su parte, lo que hace es extender de la clase figura, declarando el lado y en el constructor vemos aquí la llamada super, que es importante para que el nombre y el color de la figura pasen a la clase padre. 108 00:11:36,860 --> 00:11:44,879 Aquí se inicializa el lado y los métodos setter y getter para obtener o establecer el lado 109 00:11:44,879 --> 00:11:52,019 Por su parte también tenemos la sobrescritura de los métodos área y volumen para poder hacer el cálculo del cubo 110 00:11:52,019 --> 00:12:01,159 Tenemos otro fichero java, como veis cada clase la hemos implementado en un fichero con extensión java 111 00:12:01,159 --> 00:12:05,340 también extiende la clase figura 112 00:12:05,340 --> 00:12:09,620 y es un poco la misma implementación 113 00:12:09,620 --> 00:12:11,460 que se ha hecho con la clase cubo 114 00:12:11,460 --> 00:12:14,279 a excepción de que aquí tenemos el atributo radio 115 00:12:14,279 --> 00:12:17,820 y los cálculos del área y del volumen 116 00:12:17,820 --> 00:12:21,500 son propios de la esfera en lugar del cubo 117 00:12:21,500 --> 00:12:23,840 para la clase paralel epípedo 118 00:12:23,840 --> 00:12:25,220 es exactamente igual 119 00:12:25,220 --> 00:12:28,720 lo único es que tenemos los tres lados necesarios 120 00:12:28,720 --> 00:12:31,460 alto, ancho y largo 121 00:12:31,460 --> 00:12:35,220 y con esos tres lados 122 00:12:35,220 --> 00:12:37,299 y sus métodos getter y setter 123 00:12:37,299 --> 00:12:38,980 que podemos en cualquier momento 124 00:12:38,980 --> 00:12:41,559 con el método setter 125 00:12:41,559 --> 00:12:42,820 veis que se puede cambiar el lado 126 00:12:42,820 --> 00:12:44,440 y poner el que queramos 127 00:12:44,440 --> 00:12:47,299 o con el método getter 128 00:12:47,299 --> 00:12:48,659 para obtener esos datos 129 00:12:48,659 --> 00:12:49,820 en modo de cadena 130 00:12:49,820 --> 00:12:53,659 y también están sobre escritos 131 00:12:53,659 --> 00:12:55,519 sus métodos área y volumen 132 00:12:55,519 --> 00:12:59,409 si vemos ahora el programa principal 133 00:12:59,409 --> 00:13:05,809 para que veáis cómo está construido, pues tiene una clase principal donde tenemos el método main 134 00:13:05,809 --> 00:13:11,830 y este método main, fijaos cómo están construidas las tres primeras líneas, son importantes 135 00:13:11,830 --> 00:13:18,629 porque es donde se ve cómo están creados los objetos. 136 00:13:19,169 --> 00:13:26,149 Si os fijáis aquí hay una clase cubo, que es esta de aquí, que este es el objeto, ¿vale? 137 00:13:26,149 --> 00:13:39,250 Este es el objeto, clase cubo, esta es la clase, este es el objeto, y hacemos un new de esta clase, de modo que al instanciar esta clase con el new estamos llamando al constructor. 138 00:13:39,649 --> 00:13:45,929 ¿Qué se le está pasando al constructor? Pues le estamos pasando un 5, un nombre y un color, ¿vale? 139 00:13:45,929 --> 00:13:52,509 Si veis esta llamada en el cubo sería esta de aquí, ¿vale? 140 00:13:53,049 --> 00:14:00,450 Veis que se le pasa el 5 estaría aquí, aquí el nombre del cubo y aquí el color del cubo que creo que hemos puesto color rojo, ¿vale? 141 00:14:01,129 --> 00:14:14,049 Cuando se hace esta llamada a la clase padre se le pasa el color y el nombre y a la clase cubo se le pasa el valor del lado, ¿vale? 142 00:14:14,049 --> 00:14:22,529 De modo que una vez que tengamos esta llamada hecha, ya tenemos construido nuestro primer objeto, que se llama cubo1, con estas características. 143 00:14:23,250 --> 00:14:39,450 Lo mismo ocurre con esfera1. Fijaos que en esfera1 se hace una llamada, a ver si encuentro la clase, aquí al constructor, que es este de aquí, y se le pasa el radio, el nombre y el color. 144 00:14:39,450 --> 00:14:42,610 Funciona exactamente igual que en la clase cubo 145 00:14:42,610 --> 00:14:45,450 Y en la clase paralel epípedo 146 00:14:45,450 --> 00:14:48,169 Como tenemos un constructor con más argumentos 147 00:14:48,169 --> 00:14:51,870 Aquí tenemos el constructor que tiene 148 00:14:51,870 --> 00:14:55,590 Uno, dos, tres, cuatro y cinco argumentos 149 00:14:55,590 --> 00:14:58,129 El lado A, el B, el C, el nombre y el color 150 00:14:58,129 --> 00:15:00,990 Pues obviamente aquí hay que pasarle esos cinco argumentos 151 00:15:00,990 --> 00:15:04,710 Este sería el lado A, lado B, lado C, nombre y color 152 00:15:04,710 --> 00:15:09,919 Y una vez que tenemos los objetos creados con el new 153 00:15:09,919 --> 00:15:31,840 pues ya lo podemos utilizar, ¿vale? Aquí tenemos un ejemplo de, pues aquí nos va a mostrar los datos del cubo 1, ¿vale? Se va a mostrar su nombre, su color, fijaos que aquí en cubo 1, otra cosa curiosa, se está haciendo una llamada a un método que no está en cubo 1, ¿vale? 154 00:15:31,840 --> 00:15:54,419 Fijaos que cubo1 hace una llamada a obtener nombre, si nos vamos a cubo1, aquí no está el método obtener nombre, pero sí que estará en la clase figura, obtener nombre, eso significa que realmente desde la clase hija puede hacer llamadas a métodos públicos de la clase padre. 155 00:15:54,419 --> 00:16:10,480 ¿Y qué va a obtener con este, qué va a hacer este método getter? Pues va a obtener el nombre del cubo que nosotros le hemos puesto en la creación del cubo, ¿vale? Entonces, fijaos, el objeto hijo llama a un método del objeto de la clase padre. 156 00:16:10,480 --> 00:16:18,960 Lo mismo ocurre con color y estos ya son métodos de la clase hija, ¿vale? 157 00:16:19,460 --> 00:16:22,539 Lo mismo ocurre con la esfera, ¿vale? 158 00:16:22,620 --> 00:16:25,600 Con distintos métodos, obviamente, excepto el nombre y el color 159 00:16:25,600 --> 00:16:29,600 Y lo mismo ocurre con el paralelepípedo, ¿vale? 160 00:16:29,620 --> 00:16:32,240 Vamos a hacer una ejecución de la aplicación 161 00:16:32,240 --> 00:16:39,129 Y aquí abajo, no sé si lo llegáis a ver bien, pues está esta ejecución 162 00:16:39,129 --> 00:17:00,559 Aquí están los datos del cubo, ¿vale? Cubo 1 de color rojo con el lado 5, ¿vale? Que habíamos puesto y aquí están los cálculos, pues el área y el volumen. Aquí estaría también lo de la esfera, perdón, los datos de la esfera que están por aquí, ¿vale? 163 00:17:00,559 --> 00:17:02,399 a la esfera la habíamos puesto 164 00:17:02,399 --> 00:17:04,339 que se iba a llamar esfera 1 165 00:17:04,339 --> 00:17:05,500 iba a ser de color azul 166 00:17:05,500 --> 00:17:08,259 bueno aquí el azul lo representamos no con un color 167 00:17:08,259 --> 00:17:09,140 sino con un nombre 168 00:17:09,140 --> 00:17:12,640 y el parámetro que le hemos pasado también es un 5 169 00:17:12,640 --> 00:17:15,000 y los cálculos del área y el volumen con esos datos 170 00:17:15,000 --> 00:17:17,299 y del paralel epípedo 171 00:17:17,299 --> 00:17:18,759 que lo tenemos por aquí 172 00:17:18,759 --> 00:17:19,720 pues le hemos pasado 173 00:17:19,720 --> 00:17:22,160 los parámetros que eran 174 00:17:22,160 --> 00:17:23,740 5, 5, 10 175 00:17:23,740 --> 00:17:25,660 para el epípedo 1 176 00:17:25,660 --> 00:17:27,960 bueno aquí le hemos puesto incluso una doble o al 1 177 00:17:27,960 --> 00:17:29,759 y de color verde 178 00:17:29,759 --> 00:17:57,980 Y es lo que aparece aquí. También si os fijáis aparece el área y el volumen y como veis el área y el volumen es distinta en cada una de las figuras geométricas porque realmente si recordáis lo que hacíamos aquí era que esos métodos se van sobre escribiendo con el override en función de que sea una esfera, de que sea un paralelepípedo o en el caso de que sea un cubo. 179 00:17:57,980 --> 00:18:07,759 Bueno, y esto es todo por aquí de la programación orientada a objetos.