Desarrollo de clases 1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Entonces, vamos a grabar, todo lo que digáis me lo autoriza que esto sea grabado, y vamos
00:00:00
a ver un poquito más sobre los objetos, en particular sobre el desarrollo de clases.
00:00:10
Este es un apartado que incluye varios conceptos sobre los que hablaremos un ratito para entenderlos
00:00:16
y luego después hay una tanda de ejercicios que va más o menos a trabajar sobre estos.
00:00:26
El primer concepto es el metodomain, el metodomain ya lo conocéis, ya lo habéis usado mil veces,
00:00:34
sin embargo vamos a verlo, no lo digo más en profundidad, entenderlo un poquito mejor.
00:00:42
El prototipo, el prototipo es sustancialmente las palabras claves que se han utilizado para crear el metodomain,
00:00:50
es el que siempre utilizamos, public static, void main, string, array, args.
00:00:57
Entonces, main es el nombre, es como se llama este método, es el metodomain, es un método público,
00:01:04
se puede ejecutar públicamente, esto no lo hemos visto todavía, lo veremos al final de estas transparencias que son los varios cambios.
00:01:13
Static es que es un método estático, no se refiere a un objeto concreto, se ejecuta en ámbito estático,
00:01:22
de hecho nosotros no creamos un objeto para luego poder ejecutar el main, se ejecuta directamente.
00:01:30
No devuelve nada, void, no se espera que devuelva nada de esto, y pilla como parámetro un array de strings.
00:01:36
Cosa que siempre hemos escrito aquí, y nunca nos hemos preguntado que es esto.
00:01:46
Y ahora iremos a ver que es esta cosa aquí.
00:01:52
En general, este es el punto de acceso a mi programa, cada sistema, cada conjunto de clases, cada conjunto de objetos,
00:01:59
y tened en cuenta que ahora cuando empezaremos la programación orientada a objetos, tendremos muchas clases,
00:02:08
muchas clases de objetos distintos que trabajarán entre ellos, mandándose mensajes, llamando un método de un a otro,
00:02:16
pero tendrá siempre que haber en todo este conjunto de no se cuantas clases, un punto que es de aquí empieza mi programa.
00:02:25
Este es el punto donde todo empieza, y esto normalmente suele ser el método main.
00:02:34
El string of args es sustancialmente los parámetros con que ejecuto mi programa.
00:02:44
Vosotros os acordáis que cuando hicimos la clase miclase a principio, una de las primeras prácticas que hicimos fue ejecutar una clase desde línea de comando.
00:02:52
Entonces lanzamos dos comandos, por un lado el javac de miclase.java, y esto lo que hacía era crear un miclase.class, os acordáis,
00:03:04
era la primera parte, era como un compilador de java, pero sabemos que java no es compilado, es interpretado,
00:03:16
tenemos un programa que se llama la java virtual machine, que lo que hace es leer el punto class,
00:03:23
que hay un lenguaje especial que se llama el bytecode, que es la mitad entre el java y el lenguaje máquina,
00:03:31
y lo que hace es ejecutar e interpretar cada una de las instrucciones del lenguaje máquina y pasársela al procesador.
00:03:37
Cuando nosotros llamamos java miclase, él ejecuta miclase empezando desde el main.
00:03:46
¿Qué pasa si yo llamo java miclase y luego le pongo detrás algo, tres y otra cosa?
00:03:53
¿Si lanzo esto en vez que solo java miclase?
00:04:03
¿Qué le pasa a estas cosas de aquí, que normalmente son los parámetros?
00:04:07
Si vosotros habéis utilizado en algunas otras asignaturas la línea de comando, el cmd,
00:04:11
y habéis hecho un ping, habéis hecho cualquier comando, muchas veces el comando es el programa que vais a ejecutar,
00:04:17
y luego detrás tiene un conjunto de parámetros que se pueden lanzar.
00:04:24
Imaginémonos que yo hago un programa que necesita parámetros, que cuando se lanza necesita parámetros,
00:04:29
como este de aquí, que necesita esta palabra, este número y otra palabra.
00:04:35
¿Dónde acaban estos parámetros de aquí dentro de mi programa?
00:04:39
Pues acaban en args.
00:04:44
Cuando yo ejecuto java miclase algo, tres, otra cosa, en args de cero, en la posición cero de mi array args,
00:04:47
encontraré esta palabra de aquí, algo, como string.
00:05:00
¿Por qué como string? Porque es un array string.
00:05:04
¿Sí?
00:05:09
Luego está otra palabra que es tres, entonces en args de uno encontraré tres.
00:05:11
Cuidado, como string, porque no es un entero, no es el entero tres, es la cadena de caracteres,
00:05:17
el carácter tres y nada más.
00:05:25
Que luego yo pueda de alguna forma convertir ese carácter de allí en un número, pues eso ya veremos que se puede hacer.
00:05:28
Pero por ahora es el string tres, es esta cosa de aquí.
00:05:35
Y en args de dos, otra cosa.
00:05:50
Imaginémonos que yo esté dentro de un main, estoy en el método main.
00:05:54
La pregunta es, ¿cómo puedo saber cuántos parámetros me han pasado?
00:06:00
Imaginémonos que nosotros estamos en una clase, clase prueba.
00:06:16
Estoy aquí dentro.
00:06:25
Estoy aquí dentro, ¿vale?
00:06:31
Y la pregunta es, quiero saber aquí dentro en tiempo de ejecución, cuando se ejecute esto, cuántos parámetros me han pasado.
00:06:34
¿Cómo sabré cuántos parámetros me han pasado? Pues con args.length.
00:06:46
args.length.
00:06:52
Esta cosa de aquí me define cuántas posiciones tiene args.
00:06:57
Y como por cada parámetro que me dan, yo lo voy a poniendo en una posición distinta, pues al final si me han dado cinco parámetros, pues tendré cinco posiciones.
00:07:05
Entonces args.length será cinco.
00:07:17
Entonces esto, por ejemplo, se puede utilizar para hacer cosas como, imaginaos, si args.length es igual a cero.
00:07:22
Si alguien ha intentado lanzar mi programa sin darme ningún parámetro de ejecución, y yo necesito parámetros de ejecución, pues le puedo poner,
00:07:40
sigo diciendo, este programa se usa así.
00:07:55
Y ponerle las instrucciones para poderla lanzar.
00:08:06
Java, prueba tu nombre.
00:08:16
Entonces, ¿qué pasa? Que si yo lanzo este programa aquí, me dirá, mira, este programa se usa así.
00:08:25
Java, prueba tu nombre.
00:08:35
Entonces ahora ya sé que no puedo lanzar Java prueba solo, sino necesito añadirle otro parámetro aquí que sea tu nombre.
00:08:37
¿Qué hace esto?
00:08:47
Si no, esto quiere decir que args.length no es igual a cero, y por lo tanto hay algo en args.length, hay al menos la posición cero.
00:08:49
Y, por ejemplo, lo que hace mi programa es decirte, hola, más args de cero.
00:09:02
Fijaos que aquí args de cero no está por ningún lado, nadie lo ha rellenado.
00:09:16
Y si yo lo lanzo, pues siempre me dará este de aquí porque no le he puesto ningún nombre.
00:09:21
Si lo lanzara desde línea de comando, desde el cmd, y escribiera Java prueba y mi nombre, Stefano, pues probablemente me escribiría hola Stefano.
00:09:27
¿Cómo hago en Eclipse para que cuando él se ejecute tenga algo en los parámetros?
00:09:39
Como argumento.
00:09:48
En ejecución aquí puedo utilizar Run Configurations.
00:09:50
En Run Configurations hay una opción de argumentos.
00:10:02
Lo que yo escribo aquí es como si lo escribiera después de Java prueba.
00:10:07
Entonces escribo Stefano aquí, es como si estuviera lanzando Java prueba Stefano.
00:10:13
Entonces, ahora cuando lo lanzo, porque ahora ya algo hay, Stefano lo ha puesto dentro de args de cero,
00:10:20
por lo tanto args.length no es cero, sino es uno, por lo tanto me va en la rama else y aquí me puede escribir.
00:10:34
¿Para qué me pueden servir estas cosas?
00:10:43
Porque a veces nosotros podemos hablar con el usuario y decirle, no, yo lanzo un programa y digo, vale, usuario, dame tu nombre y yo escribo su nombre.
00:10:46
Pero otras veces yo no tengo interacción con un usuario, yo tengo que hacer una operación.
00:10:56
Y esta operación tiene que estar hecha sobre un fichero, sobre un objeto, sobre algo.
00:11:02
O un string, o que use algo que al momento de ejecutarlo me digan cuáles son los argumentos, cuáles son los parámetros que voy a utilizar.
00:11:09
Si pensáis en un programa como el copiar ficheros, que no sé si lo habéis visto, xcopy, nombre del fichero, espacio, otro nombre del fichero,
00:11:19
que copia el primer fichero dentro del segundo fichero.
00:11:29
Pues los dos ficheros al fin y al cabo son parámetros.
00:11:33
Si yo quisiera hacer la clase copia fichero, que lo que hace es pillar dos ficheros y copiarlos de uno a otro y usarlo directamente en línea de comando,
00:11:36
pues lo debería hacer con esta cosa aquí.
00:11:45
A lo mejor en un futuro, en algunos ejemplos y en algunas circunstancias, usaremos este fichero, este array.
00:11:49
La cosa fundamental de por qué lo estamos viendo es para saber qué es esto.
00:12:01
Porque desde el día uno lo hemos puesto allí y no sabíamos hasta ahora para qué servía.
00:12:05
A partir de ahora sabemos tanto para qué sirve y cómo lo puedo utilizar dentro del Eclipse.
00:12:10
¿Dudas?
00:12:23
Esto es string.args.
00:12:32
Otros conceptos que nos interesan a nivel de clase.
00:12:34
Como hay un método main, normalmente en un conjunto de clases debería haber una clase main.
00:12:38
La clase main no se tiene que llamar main.
00:12:44
Tiene que existir una clase que se llame main así.
00:12:47
No necesariamente.
00:12:51
Pero cuando yo hago un proyecto, sobre todo si el proyecto es suficientemente grande,
00:12:54
y hemos dicho ahora que tengo varias clases y muchas clases y me las encuentro allí,
00:12:58
debería ser relativamente fácil saber cuál es la clase que yo lanzo.
00:13:03
Pensad al ejemplo que hemos hecho antes del examen, que había la clase alumno, había la clase prueba.
00:13:08
Yo si me encuentro un montón de ficheros.java, no sé dónde está el punto de acceso de mi programa.
00:13:18
Por lo tanto, normalmente cuando yo hago una estructura, un proyecto con muchas clases,
00:13:27
debería elegir una clase y decir esta es la clase que se ejecuta.
00:13:32
Esta es la que tiene el main.
00:13:35
Todos los demás clases no necesariamente no tienen que tener el main.
00:13:37
Pueden tenerlo, pero no es el punto de acceso de mi programa.
00:13:43
Normalmente, las otras clases pueden tener un main para hacer pruebas concretas de esa clase.
00:13:47
Yo podría poner en el ejemplo que hacíamos antes de alumno, un main dentro de alumno,
00:13:56
para probar el objeto alumno.
00:14:03
Creo un objeto alumno, le pruebo los métodos, le pongo unos datos y cosa por el estilo.
00:14:06
Pero luego, mi programa de verdad no es eso.
00:14:11
Esta práctica de poner un método main dentro de una clase para probarla,
00:14:16
prácticamente hoy en día se usa poco porque hay otras utilidades como el JUnit,
00:14:21
que son pruebas unitarias, que lo veremos más adelante,
00:14:27
a lo mejor lo veréis en el entorno de programación, eso ya lo veremos.
00:14:31
Pero son bacterias de pruebas que yo hago para probar extensamente mis clases, mis objetos.
00:14:34
Entonces, en vez de hacerlo con un main allí dentro que hago lo que me da la gana,
00:14:43
pues tengo esta bacteria de pruebas que está hecha para otros equipos desarrolladores,
00:14:46
a lo mejor de mi empresa, para que me digan, si tú haces todas estas pruebas y todas las pruebas te dan ok,
00:14:53
pues probablemente tu objeto hace las funcionalidades por las que está pensado.
00:14:59
Pero lo veremos más adelante.
00:15:06
Por ahora, para nosotros, si vosotros estáis haciendo un examen, un ejercicio que tiene 5 clases,
00:15:09
y habéis creado la clase alumno que tiene su método de calcular media,
00:15:14
y queréis probar ese alumno, pues os hacéis un main dentro de esa clase,
00:15:20
allí dentro creáis un objeto, le rellenáis las notas y probáis la clase media, el método media,
00:15:24
para ver si funciona.
00:15:30
Pero no es el punto de acceso de todo el sistema, es el punto de acceso para probar alumno.
00:15:32
¿Me entendéis?
00:15:37
Por otro lado, deberíais crear una clase que podría llamarse main,
00:15:39
porque es fácil de detectar, o podría llamarse de otra forma,
00:15:43
como el ejemplo de DAIO competición, ¿os acordáis?
00:15:48
Que allí dentro había el main, esa era mi clase main en el examen.
00:15:51
Vale, no tiene por qué llamarse main, pero es la clase detonante,
00:15:57
la clase que hace partir todo mi proyecto.
00:16:02
Concepto de static y no static, que ya hemos repasado hace un momento,
00:16:04
pero vamos a hacerlo un poquito más en detalle.
00:16:11
Un método o una variable puede ser static o no static.
00:16:14
Cuando no es estático, cuando no se considera un método no es estático.
00:16:21
No se usa cuando me estoy refiriendo a algo que depende de un objeto concreto,
00:16:27
o sea, esa variable, ese atributo o ese método,
00:16:34
necesita ser llamado sobre un objeto concreto,
00:16:40
porque utiliza características de ese objeto concreto para funcionar.
00:16:47
¿Vale?
00:16:53
Eso quiere decir que si hago la misma operación, acceder a una variable,
00:16:54
o llamar un método sobre objetos distintos,
00:16:58
el resultado que puedo obtener es distinto,
00:17:02
porque usará objetos o usará variables propias del objeto.
00:17:07
Un atributo de una clase aparecerá en todas las instancias de esa clase,
00:17:18
y por cada instancia tiene un valor distinto de ese atributo,
00:17:22
y ese atributo no es estático, porque cada instancia tiene su propio atributo.
00:17:25
Un valor distinto, o sea, el valor puede ser el mismo,
00:17:30
pero son copias distintas del mismo valor.
00:17:34
Cuando yo tengo un atributo que no es estático,
00:17:43
quiere decir que cada objeto tiene su propia copia.
00:17:46
Cada objeto tiene su celda de memoria donde dentro almacenará ese valor.
00:17:49
¿Vale?
00:17:56
Y que dos objetos distintos tienen dos valores distintos,
00:17:57
si yo cambio en uno, no lo estoy cambiando en el otro.
00:18:02
¿Vale?
00:18:05
El valor de esa variable.
00:18:06
Cuidado que si luego esa variable es un objeto,
00:18:08
puede haber cosas un poquito más complejas,
00:18:10
pero lo hablaremos más después.
00:18:12
¿Vale?
00:18:14
Pensadlo como int.
00:18:15
Si yo tengo una persona con int edad.
00:18:16
¿Vale?
00:18:19
Si yo tengo dos personas, dos objetos personas,
00:18:20
la variable int de que estas objetos personas son separadas, son distintas.
00:18:22
¿Vale?
00:18:28
Si yo cambio la edad de un objeto, no la estoy cambiando en otro.
00:18:29
¿Si?
00:18:32
Los dos pueden tener la misma edad,
00:18:33
pero son dos valores separados, son dos trozos de memoria separados.
00:18:35
Digámoslo así.
00:18:39
¿Si?
00:18:40
Y el método no es estático cuando tú lo tienes que llamar sobre un objeto concreto.
00:18:41
Al llamar este método sobre un objeto concreto,
00:18:46
utilizará valores, atributos y hará operaciones sobre ese objeto,
00:18:49
no sobre los otros objetos.
00:18:54
¿Si?
00:18:57
Entonces, en un cierto sentido, si no es estático,
00:18:58
tiene una independencia por cada objeto distinto.
00:19:00
Cada objeto distinto es independiente de lo que hace,
00:19:04
de los valores que tiene con respecto a otros objetos.
00:19:08
Dudas.
00:19:12
Ejemplo.
00:19:15
¿Vale?
00:19:17
Pillamos la clase rectángulo.
00:19:18
Aquí está la clase rectángulo.
00:19:21
¿Qué modeliza?
00:19:23
Modeliza un rectángulo.
00:19:25
¿Vale?
00:19:26
¿Qué necesito poner para un rectángulo?
00:19:27
Pues un entero que es el largo del rectángulo,
00:19:29
y un entero que es el ancho del rectángulo.
00:19:32
¿Vale?
00:19:34
Estos son sus atributos.
00:19:35
¿Qué valores, qué métodos tiene?
00:19:37
¿Vale?
00:19:41
No tiene un constructor, no se lo he puesto,
00:19:42
pero tiene un método que es el método setData.
00:19:44
¿Vale?
00:19:48
Aquí podría poner el public.
00:19:49
No pone public, pero no cambia nada por ahora.
00:19:50
El método setData pilla dos variables,
00:19:52
L y B,
00:19:55
y pone que L es largo,
00:19:57
y B es el ancho.
00:19:59
Ya está.
00:20:01
Esto debería ser A.
00:20:02
Pero bueno.
00:20:03
Se me ha colado la vida.
00:20:04
¿Si?
00:20:05
Tiene otro método que es el método Area.
00:20:06
Fijaos que Area no tiene parámetros.
00:20:09
Y lo que hace es calcular el área de este rectángulo.
00:20:11
¿Vale?
00:20:16
Utilizando estos datos de aquí.
00:20:17
Y después de haber calculado el área, la devuelvo.
00:20:19
¿Si?
00:20:23
Entonces, ¿cómo uso estas cosas?
00:20:24
Por ejemplo, aquí tengo un Main.
00:20:26
¿Vale?
00:20:28
Esta sería la clase Main.
00:20:29
¿Si?
00:20:30
Y lo que hace es crearme dos rectángulos.
00:20:31
¿Si?
00:20:34
Fijaos que los rectángulos no tienen constructor.
00:20:35
Por lo tanto, es un constructor vacío.
00:20:37
En este momento, yo he creado dos objetos rectángulos,
00:20:39
y los dos tendrán 0 y 0 en sus valores.
00:20:43
¿Vale?
00:20:47
Porque 20 por defecto vale 0.
00:20:48
Y luego, sobre el rectángulo 1,
00:20:50
llamo el método setData.
00:20:54
Este setData de aquí.
00:20:56
¿Vale?
00:20:58
Que recibe dos parámetros.
00:20:59
Son 5 y 6, por ejemplo.
00:21:02
Si yo hago esta cosa de setData 5 y 6,
00:21:05
lo que quiere decir es que he cambiado,
00:21:09
he modificado el rectángulo 1.
00:21:11
Que ahora tendrá rectángulo1.largo será 5,
00:21:13
y rectángulo1.ancho será 6.
00:21:19
Justo.
00:21:24
¿He cambiado algo de rectángulo 2?
00:21:25
No.
00:21:28
Son dos instancias completamente separadas.
00:21:29
No dependen una de otra.
00:21:32
¿Si?
00:21:34
Y cuando calculo rectángulo1.área,
00:21:35
lo que me hará es ir a mirar este método
00:21:41
sobre rectángulo 1.
00:21:46
Este método pillará largo y ancho.
00:21:48
Largo ahora vale 5,
00:21:50
y ancho ahora vale 6.
00:21:52
Por lo tanto me hará 6 multiplicado 5,
00:21:55
y aquí el resultado,
00:21:58
cuando escribo área de rectángulo 1,
00:22:00
será el resultado de la operación 5x6.
00:22:02
¿Si?
00:22:06
Ahora voy a llamar setData sobre el otro objeto.
00:22:08
Entonces esto modificará los datos de rectángulo 2,
00:22:13
no de rectángulo 1.
00:22:17
Rectángulo 1 es completamente independiente.
00:22:19
Y cuando llamo el mismo método,
00:22:21
es siempre área, es el mismo código,
00:22:23
pero sobre un objeto distinto,
00:22:25
ahora los datos que estoy utilizando
00:22:28
no son los de rectángulo 1,
00:22:31
sino son los de rectángulo 2.
00:22:33
Entonces serán 1 y 3.
00:22:36
Largo 1, ancho 3, 1x3, 3.
00:22:39
Entonces área valdrá 3.
00:22:44
Entonces el resultado de llamar área
00:22:46
sobre rectángulo 1
00:22:50
dependerá de los valores de rectángulo 1,
00:22:52
y el resultado de llamar área sobre rectángulo 2
00:22:55
dependerá de los valores de rectángulo 2.
00:22:59
Fijaos que estos métodos,
00:23:01
como tanto setData,
00:23:04
se están llamando sobre una instancia.
00:23:05
Esta de aquí, rec1 y rec2,
00:23:08
son instancias de la clase rectángulo.
00:23:11
¿Dudas?
00:23:16
Todo esto estamos en un ejemplo
00:23:21
de métodos no estáticos.
00:23:24
¿Veis que aquí estático no existe?
00:23:26
No lo he puesto.
00:23:28
El único estático que aparece es esto,
00:23:29
porque es el main,
00:23:30
porque tiene que ser así,
00:23:31
es el punto de acceso a mi programa.
00:23:33
Pero luego aquí todo lo que estoy haciendo
00:23:35
son sobre instancias, no sobre clases.
00:23:37
¿Dudas?
00:23:43
¿Cuándo en vez se utiliza el estático?
00:23:46
¿Cuándo tenemos que ver algo con estático?
00:23:54
Un entorno es estático cuando me refiero
00:23:57
a algo que no pertenece a un objeto concreto,
00:24:00
sino a la clase.
00:24:03
Es algo que tiene que ver con la clase,
00:24:05
no con una instancia de esa clase.
00:24:08
Son métodos o son variables
00:24:11
que no tienen nada que ver con un objeto o con otro.
00:24:14
En un objeto o en otro objeto distinto
00:24:17
el método o esa variable es lo mismo.
00:24:21
No dependen de si lo estoy utilizando
00:24:26
sobre una instancia o sobre otra.
00:24:30
Son independientes de la instancia.
00:24:32
Entonces una variable estática tendrá el mismo valor
00:24:36
para cualquier objeto que la use.
00:24:38
Si un objeto usa esa variable
00:24:40
o otro objeto usa esa variable,
00:24:41
no es que dependen de la instancia,
00:24:43
sino que valdrá el mismo valor.
00:24:45
Es como si las varias instancias
00:24:47
compartieran esta variable
00:24:51
y cuando uno modifica esta variable
00:24:54
todos los demás ven esa modificación.
00:24:56
No hay un trozo de memoria por cada instancia
00:25:00
donde dentro se guarda un valor,
00:25:04
sino que hay un trozo de memoria solo
00:25:06
y todos los que la usan
00:25:09
utilizan ese trozo de memoria.
00:25:11
Por lo tanto, si alguien lo modifica
00:25:12
todos verán esa modificación.
00:25:14
Y un método estático no se llama sobre un objeto,
00:25:18
sino que se llama sobre una clase.
00:25:22
Entonces un método estático
00:25:24
no puede tener acceso a las variables no estáticas.
00:25:26
Si yo tengo un objeto,
00:25:33
tengo mi objeto rectángulo 1,
00:25:38
con dentro su largo y su ancho.
00:25:41
Estos son trozos de memoria
00:25:44
donde dentro le pongo que era 5 y 6.
00:25:46
Este es el 1.
00:25:50
Luego tenía otro rectángulo distinto
00:25:51
que era el 2, que tenía lado 1,
00:25:54
largo 1 y ancho era 3.
00:25:57
Cada instancia tiene sus propios valores.
00:26:02
Si ahora yo creo un método, una variable estática,
00:26:07
esta variable está fuera de los objetos.
00:26:11
Y yo pongo aquí un valor.
00:26:14
Si este objeto de aquí,
00:26:17
con un método o de alguna forma,
00:26:19
modifica esto y lo cambia a 5,
00:26:21
también este objeto ve este cambio.
00:26:24
Porque no pertenece al objeto,
00:26:28
pertenece a la clase.
00:26:30
Todo esto son instancias de la misma clase.
00:26:37
Y la clase tiene un trozo de memoria
00:26:40
que es compartido por todas las instancias.
00:26:43
O si es público, hasta por otros objetos.
00:26:48
Pero los objetos que acceden a este espacio de memoria
00:26:52
que no depende de una instancia concreta.
00:26:57
Depende de la clase.
00:27:00
Y si yo tengo un método estático,
00:27:05
lo representaremos.
00:27:08
Este es un método estático que hace algo, no lo sé.
00:27:10
Este método estático, si usa ancho o usa largo,
00:27:14
no sabe si tiene que utilizar esto o este de aquí.
00:27:18
Porque si es estático no hace referencia a un objeto.
00:27:22
Por lo tanto no lo puede utilizar.
00:27:25
Un método estático puede utilizar solo variables estáticas.
00:27:27
Porque si yo uso algo no estático,
00:27:32
debería saber de qué objeto lo estoy utilizando.
00:27:35
Y este método no lo sabe, a menos que no se lo he pasado por parámetro
00:27:39
o he hecho algo especial.
00:27:43
Entonces, lo que me interesa es que quede claro
00:27:46
que hay dos mundos.
00:27:49
El mundo estático, que es todo lo que se refiere a la clase,
00:27:51
pero que es, en un cierto sentido, independiente
00:27:54
de cuántas instancias hay o de qué instancias haya.
00:27:57
Mientras el mundo no estático,
00:28:01
que es profundamente dependiente
00:28:05
de la instancia sobre la que trabaja.
00:28:10
Entonces, por un lado, por ejemplo,
00:28:15
hay los métodos estáticos que se llaman sobre la clase
00:28:18
y los métodos no estáticos que se llaman sobre una instancia,
00:28:21
sobre un objeto.
00:28:25
Vamos a ver un ejemplo de método estático.
00:28:29
Imaginámonos esta clase estática de aquí.
00:28:35
Esta clase estática tiene un intero estático
00:28:40
que se llama operaciones hechas.
00:28:44
Esto es que quiero saber cuántas operaciones se han hecho.
00:28:47
Cada vez que haré una de las operaciones que tengo aquí
00:28:51
en mi clase, quiero sumar uno a esto.
00:28:55
No me importa si lo está haciendo uno u otro.
00:28:59
Lo que quiero hacer es que si se hace una operación,
00:29:03
se suma una aquí.
00:29:06
Al final, en clase estática, en esta variable de aquí,
00:29:08
tendré el número de operaciones hechas.
00:29:12
¿Cuántas operaciones se pueden hacer?
00:29:15
Pues tengo dos métodos estáticos,
00:29:17
que son cálculo área de rectángulo.
00:29:19
Oye, es lo mismo que antes.
00:29:21
Pero fijaos que ahora tiene dos parámetros.
00:29:24
Porque ahora no puede hacer cálculo área de rectángulo
00:29:27
sin parámetros.
00:29:30
Porque me diría, ¿y cuál es el largo y el ancho?
00:29:32
No tengo un objeto al que referirme
00:29:35
y este objeto tiene un ancho y un largo
00:29:38
y entonces hago la multiplicación entre este ancho y el largo.
00:29:40
En un entorno estático no tengo instancias.
00:29:43
Por lo tanto, no tengo objetos, no tengo...
00:29:46
¿Qué hago? Pues se lo paso por parámetro.
00:29:49
Lo puede hacer, sí.
00:29:52
Calcular un área de rectángulo si me dan el largo y el ancho
00:29:54
lo puede hacer hasta sin saber de qué objeto estoy hablando.
00:29:57
¿Sí o no?
00:30:01
Entonces en este caso haría largo por ancho,
00:30:03
fijaos, sumo uno a esta variable de aquí
00:30:06
para decir que he hecho una operación,
00:30:10
he hecho calcular área de rectángulo
00:30:12
y luego devuelvo la área de rectángulo.
00:30:14
Y luego está, calcula perímetro de rectángulo
00:30:17
que es otra operación que necesita,
00:30:20
también necesita los dos lados.
00:30:22
Lo calculará de forma distinta, suma uno
00:30:25
a las operaciones hechas.
00:30:28
Entonces tanto que calcule el área como calcule el perímetro
00:30:31
sumo uno a cuantas operaciones he hecho
00:30:34
y luego devuelvo.
00:30:37
Esta es una clase estática.
00:30:39
¿Por qué? Porque no tiene nada aquí que no sea estático.
00:30:41
Justo.
00:30:46
¿Tiene sentido hacer objetos de esta clase?
00:30:47
¿Hacer clase estática x es igual a new clase estática?
00:30:49
La pregunta es entonces,
00:30:55
¿la variable estática y operación hechas
00:30:57
opera en toda la clase?
00:31:00
Pertenece a la clase.
00:31:02
¿Y si haces una variable que sea una clase
00:31:03
¿opera en todo el paquete?
00:31:04
¿Cómo?
00:31:06
¿Si haces una variable que sea una clase
00:31:07
¿opera en todo el paquete?
00:31:09
Si haces una variable, por ejemplo, static string
00:31:12
En vez de public clase estática, no puedes poner
00:31:18
Public static class
00:31:22
No, no puede, por ahora.
00:31:25
No, en principio no.
00:31:32
Public static class me pillas
00:31:34
porque no lo he visto en vida mía
00:31:36
pero no me atrevo a decir que no se puede.
00:31:38
Entonces se lo debería mirar.
00:31:41
Oye, esto se ha grabado.
00:31:43
No, lo sé, pero no os lo digo.
00:31:44
Miradlo vosotros en Google.
00:31:46
Para casa.
00:31:49
Esta es la clase estática.
00:31:52
Os pongo otra vez esta de aquí para fijaros.
00:31:55
La clase no estática tenía sus atributos
00:31:58
y programitas, métodos que utilizan estos.
00:32:02
¿Podría un método no utilizar estos?
00:32:08
Sí.
00:32:10
Podría tener un método de rectángulo
00:32:11
que no va a utilizar estos.
00:32:14
Sería un poco raro, pero podría
00:32:16
en algunos casos tener sentido.
00:32:18
Mientras que la clase estática, si os fijáis,
00:32:23
tiene sus variables estáticas,
00:32:26
pero lo que está haciendo es
00:32:28
no es dependiente de un objeto.
00:32:30
Esta es la cosa importante.
00:32:32
No tiene instancias aquí.
00:32:33
No tiene sentido crear una clase estática,
00:32:35
un objeto de la clase estática,
00:32:38
porque no tiene algo que dependa
00:32:39
de la clase estática.
00:32:42
No es un valor que dependa
00:32:44
de una instancia en concreta.
00:32:47
No tiene nada que no sea estático.
00:32:48
¿Cómo uso esta?
00:32:50
Me hago mi clase estática main,
00:32:52
donde tengo el main.
00:32:55
Y, por ejemplo, tengo dos rectángulos.
00:32:57
Este es el rectángulo 2.
00:33:00
Uno de largo 3 es ancho 6.
00:33:01
El otro de largo 1 es ancho 3.
00:33:03
Y puedo hacer algo parecido con el otro.
00:33:06
El rectángulo 1 tiene área.
00:33:08
Y ahora me llamo el método
00:33:10
calcular el rectángulo 3,6.
00:33:12
¿Dónde llamo este método?
00:33:16
¿Sobre un objeto?
00:33:18
No, lo llamo sobre la clase.
00:33:19
¿Por qué? Porque es estático.
00:33:21
¿Podría quitar esta parte de aquí
00:33:24
y dejar sólo calcular el rectángulo?
00:33:26
No, porque en esta clase de aquí
00:33:28
no está definido calcular el rectángulo.
00:33:31
El método está definido en esta clase de aquí.
00:33:34
Entonces, si yo le estoy diciendo
00:33:37
utilizar este método de esta clase.
00:33:39
Como cuando hacemos math.random.
00:33:43
Quiero utilizar el método random
00:33:46
definido en la clase math.
00:33:48
¿En una instancia de la clase math?
00:33:50
No, en la clase math.
00:33:51
Es estático.
00:33:53
Y esto me da 3x6.
00:33:56
Y lo escribe.
00:34:00
Y luego lo que voy a hacer del otro rectángulo.
00:34:02
Cuidado que aquí no estoy creando
00:34:04
rectángulos nuevos.
00:34:06
No estoy creando objetos.
00:34:08
No hay instancias.
00:34:10
Pero utilizo el calcular al rectángulo
00:34:12
y ya está.
00:34:14
Esto podría ser una suite
00:34:16
de métodos de geometría
00:34:18
para calcular el área del cuadrado,
00:34:23
el área del rectángulo,
00:34:26
el área del círculo,
00:34:27
el área de no sé qué.
00:34:28
Y que luego yo utilizo esta suite
00:34:29
cuando quiero utilizar
00:34:31
alguna de estas formas
00:34:33
y calcular el área de alguna de estas formas.
00:34:34
Sin necesidad de crearme un objeto
00:34:37
para poder calcular esa cosa.
00:34:39
¿Sí?
00:34:41
Como es la clase math.
00:34:43
La clase math es un conjunto
00:34:45
de métodos relacionados con la matemática
00:34:47
como hacer un número aleatorio, por ejemplo,
00:34:51
que están allí
00:34:53
y yo puedo utilizarlas.
00:34:55
La clase math tiene otros métodos
00:34:57
como calcular la raíz cuadrada.
00:34:59
Calcular la raíz cuadrada
00:35:01
y hacer un objeto 9
00:35:03
para luego poder llamar
00:35:05
9.raíz cuadrada
00:35:07
y sacarme 3.
00:35:09
Yo llamo math.sqrt
00:35:11
square root
00:35:13
raíz cuadrada
00:35:15
y le pongo el número que quiero hacer
00:35:17
la raíz cuadrada, 9.
00:35:19
Y el resultado es 3.
00:35:21
Y eso no depende de un objeto.
00:35:23
Se entiende la diferencia.
00:35:25
¿Y qué pasará al final?
00:35:27
Bueno, aquí calcula un perímetro.
00:35:29
Fijaos que yo no tengo un objeto.
00:35:31
Si quiero calcular ahora
00:35:33
el perímetro del primer rectángulo
00:35:35
tengo que volver a ponerle 3.6.
00:35:37
¿Se entiende esto?
00:35:39
Y la pregunta es
00:35:43
si ahora después de estas 3
00:35:45
1, 2 y 3
00:35:47
hago
00:35:49
he hecho clase estática punto operaciones
00:35:51
hecha operaciones
00:35:53
¿Cuánto me escribe aquí?
00:35:55
3.
00:35:57
¿Vale?
00:35:59
Porque cada uno de estos métodos
00:36:01
ha sumado 1
00:36:03
a operaciones hechas.
00:36:05
Entonces operaciones hechas
00:36:07
al principio cuando he arrancado todo
00:36:09
era 0.
00:36:11
La primera vez que he ejecutado esto ha sumado 1.
00:36:13
La segunda vez ha sumado 2.
00:36:15
Y la tercera ha sumado 3.
00:36:17
Por lo tanto ahora vale 3.
00:36:19
¿Esto pertenece a un objeto?
00:36:21
No.
00:36:23
¿Dudas?
00:36:25
¿Puedes mezclar dentro de lo que sería
00:36:27
la clase estática?
00:36:29
¿Dices esto?
00:36:35
No, no.
00:36:37
¿Dices esto?
00:36:39
Sí, puedes.
00:36:41
¿Estática y no estática pueden coexistir?
00:36:43
Muy buena pregunta.
00:36:45
¿Vale?
00:36:47
Habría hecho la misma pregunta.
00:36:49
Entonces yo puedo hacer
00:36:51
una clase que tenga
00:36:53
algunas componentes
00:36:55
que sean propias
00:36:57
de la clase
00:36:59
y entonces sean estáticas
00:37:01
y algunas componentes
00:37:03
que sean propias de un objeto concreto
00:37:05
y que entonces sean no estáticas.
00:37:07
¿Cómo es esta clase aquí, por ejemplo?
00:37:09
Yo me he creado
00:37:11
una clase rectángulo.
00:37:13
¿Vale?
00:37:15
Cada rectángulo puede tener instancias
00:37:17
que tendrán ancho y largo.
00:37:19
Ancho y largo depende del objeto.
00:37:21
Quiero contar cuántos rectángulos
00:37:23
se han creado.
00:37:25
Para crear cuántos rectángulos se han creado
00:37:29
si este rectángulo creado
00:37:31
fuera
00:37:33
no estático, o sea, si borras
00:37:35
estático, cada rectángulo
00:37:37
tendría una copia
00:37:39
de esta variable
00:37:41
y todos valdrían cero.
00:37:43
Entonces cuando creo un rectángulo
00:37:45
y le sumo uno
00:37:47
todos valdrían uno y todos
00:37:49
crearían que solo hay un rectángulo.
00:37:51
El mismo.
00:37:53
Sin embargo, si lo pongo como
00:37:55
rectángulo estático, o sea,
00:37:57
el rectángulo creado es estático, ya esto
00:37:59
no pertenece a la instancia.
00:38:01
¿Vale? No está
00:38:03
aquí dentro esta información.
00:38:07
Sino está aquí fuera.
00:38:09
Y cuando este
00:38:11
suma uno porque ha sido creado
00:38:13
se suma aquí.
00:38:15
Y cuando creo uno nuevo
00:38:17
se suma siempre aquí.
00:38:19
Y por lo tanto ahora hay dos
00:38:21
rectángulos creados.
00:38:23
Veamos el código.
00:38:27
Aquí lo que estoy creando es
00:38:31
un constructor que recibe
00:38:35
un ancho y un largo
00:38:37
asigna el ancho y el largo
00:38:39
como tiene que asignarlo
00:38:41
pero cada vez que se ejecute
00:38:43
este
00:38:45
constructor
00:38:47
lo que se está haciendo es sumar
00:38:49
uno a esta variable
00:38:51
que es una variable de clase.
00:38:53
Fijaos también que
00:38:55
las variables
00:38:57
estáticas están en cursiva.
00:38:59
¿Vale? Entonces lo podéis
00:39:01
saber más fácilmente.
00:39:03
Entonces el primer rectángulo
00:39:05
se creará su propio ancho y largo
00:39:07
suyos de ese objeto
00:39:09
pero sumará uno a una variable compartida
00:39:11
digamos así, una variable global
00:39:13
se puede decir.
00:39:15
Cuando el segundo rectángulo
00:39:17
hace esta cosa otra vez
00:39:19
se creará su propio ancho y largo
00:39:21
suyos que no tienen nada que ver con la otra
00:39:23
instancia
00:39:25
pero sumará uno a la misma
00:39:27
variable estática.
00:39:31
Entonces ahora vale dos.
00:39:33
Luego tengo mi método no estático
00:39:39
que usa
00:39:41
variables no estáticas
00:39:43
entonces si lo llamo
00:39:45
su rectángulo uno
00:39:47
me hará su ancho por su largo
00:39:49
y si lo llamo su rectángulo dos
00:39:51
me hará el ancho del rectángulo dos
00:39:53
por el largo del rectángulo dos
00:39:55
es decir que este método depende
00:39:57
del objeto sobre el que lo llamo
00:39:59
por lo tanto este método
00:40:01
se tendrá que llamar sobre un objeto
00:40:03
rectángulo uno punto área
00:40:05
o rectángulo dos punto área
00:40:07
y fijaos que no recibe
00:40:09
ningún parámetro
00:40:11
¿Por qué no recibe parámetros?
00:40:13
Porque los tiene
00:40:17
¿Si?
00:40:19
Ese objeto ya tendrá esos dos parámetros
00:40:21
entonces usa esos
00:40:23
¿Se entiende?
00:40:27
Y luego está
00:40:29
un método estático por ejemplo
00:40:31
que es total de rectángulos
00:40:33
creados. Cuando yo lanzo este método
00:40:35
total de rectángulos creados
00:40:37
me devuelve rectángulos creados
00:40:39
me devuelve este valor de aquí
00:40:41
¿Habría podido acceder a este valor
00:40:47
de otra forma?
00:40:49
Si yo escribo rectángulo
00:40:51
punto
00:40:53
rectángulos creados
00:40:55
accedería al mismo valor
00:40:57
Y aquí en el futuro
00:41:01
luego lo veremos más en detalle
00:41:03
Si yo quisiera que la gente pudiera tocar
00:41:05
esta cosa desde fuera
00:41:07
pues entonces aquí le pondría un private
00:41:09
Si pongo private
00:41:13
pues esta cosa de aquí
00:41:15
ya no se puede hacer rectángulo
00:41:17
punto rectángulos creados
00:41:19
no se puede acceder a esta variable
00:41:21
desde fuera
00:41:23
entonces la única forma
00:41:25
para poder leer esta variable
00:41:27
sería con este método
00:41:29
que es público
00:41:31
porque nadie podría cambiarlo
00:41:35
nadie podría entrar en rectángulo
00:41:37
hacer rectángulo punto rectángulos creados
00:41:39
igual 7
00:41:41
porque no se puede acceder desde fuera
00:41:43
la única forma para cambiarlo
00:41:45
es esta línea de aquí
00:41:47
que se ejecuta cuando creo un rectángulo
00:41:49
entonces me estoy
00:41:51
garantizando que
00:41:53
los rectángulos creados son efectivamente
00:41:55
los que se han hecho con un constructor
00:41:57
volveremos sobre este concepto
00:41:59
¿Dudas?
00:42:01
Por ahora me interesa la diferencia
00:42:05
entre estático y no estático
00:42:07
estático
00:42:09
todo lo que se refiere a la clase
00:42:11
no a una instancia de la clase
00:42:13
instancias distintas de las clases
00:42:15
ven el mismo comportamiento
00:42:17
no estático
00:42:21
depende de la instancia sobre la que lo llamo
00:42:23
sobre qué funciona
00:42:27
un método estático
00:42:29
pero pueden ser también variables estáticas
00:42:31
o no estáticas
00:42:33
¿Dudas?
00:42:35
Este es fácil
00:42:43
¿Cómo se organiza el código?
00:42:45
Nosotros organizamos códigos en clases
00:42:47
ya lo hemos visto
00:42:49
hay una clase principal y luego otras clases que usaré
00:42:51
desde la clase principal
00:42:53
ya veremos si hacemos ejemplos
00:42:55
existe también una forma
00:42:57
de organizar un poco mejor
00:42:59
las clases que son los paquetes
00:43:01
yo puedo crear un paquete
00:43:05
que contiene dentro varias clases
00:43:07
si yo tengo normalmente
00:43:09
un sistema muy complejo
00:43:11
que tiene muchas
00:43:13
clases
00:43:15
sería complejo
00:43:17
y sobre todo
00:43:19
que yo pueda organizar de alguna forma
00:43:21
porque hay un cierto
00:43:23
número de clases que se ocupan
00:43:25
de un cierto tema y otras clases de un tema
00:43:27
distintos y que tiene sentido
00:43:29
organizar estas dos
00:43:31
de alguna forma pues puedo crear paquetes
00:43:33
un paquete pues lo creo
00:43:37
fácilmente
00:43:39
desde aquí
00:43:41
normalmente nosotros todo lo que hemos hecho ahora
00:43:45
lo hemos puesto en un default package
00:43:47
el package sería el paquete
00:43:49
si yo creo un nuevo puedo crear
00:43:51
un nuevo paquete
00:43:53
crear un nuevo paquete le doy un nombre
00:43:55
por ejemplo
00:43:57
geometría
00:43:59
entonces ahora he creado
00:44:01
un paquete geometría
00:44:03
y las clases
00:44:05
que creo aquí dentro
00:44:07
si os fijáis
00:44:17
pertenecen al
00:44:19
paquete geometría
00:44:21
esto es el comando
00:44:25
que se da al principio para decirle
00:44:27
a que paquete pertenece
00:44:29
me espero
00:44:31
que el paquete geometría este en el
00:44:33
paquete geometría, si lo muevo a otro
00:44:35
paquete que no sea el paquete geometría y le dejo esto
00:44:37
pues posiblemente se enfade
00:44:39
y esto me permite
00:44:43
organizar mejor mi
00:44:45
programa, podría hacer todo sin paquetes
00:44:47
la ventaja es que
00:44:49
luego si yo hago un paquete geometría muy interesante
00:44:51
y lo quiero reutilizar
00:44:53
puedo importar
00:44:55
este paquete por otro lado
00:44:57
¿os suena algo importar un paquete?
00:44:59
¿os acordáis
00:45:05
cuando
00:45:07
hacía scanner
00:45:09
es igual a new scanner
00:45:11
de algo ¿vale?
00:45:15
y le decía
00:45:17
importa
00:45:19
¿qué estoy haciendo aquí?
00:45:21
estoy yendo a un paquete que se llama
00:45:25
java, que dentro tiene
00:45:27
un paquete que se llama util
00:45:29
que son utility de java
00:45:31
y me pillo
00:45:33
la clase scanner
00:45:35
y la importo en mi programa
00:45:37
es como si hubiese copiado
00:45:39
esa clase en mi proyecto
00:45:41
y ahora la puedo utilizar
00:45:43
pues si yo hago el paquete
00:45:45
geometría, pues en un lado
00:45:47
podría importar
00:45:49
aquí import
00:45:51
geometría o importo lo que sea
00:45:53
punto lo que sea geometría
00:45:55
y tendría todo lo que
00:45:57
lo que tengo todo desarrollado
00:45:59
aquí pues ahora lo tengo en el otro programa
00:46:01
estas son cosas un poco más avanzadas
00:46:05
a lo mejor luego lo utilizaremos más adelante
00:46:07
pero por ahora simplemente que sepáis que
00:46:09
existen y que podéis utilizar los paquetes
00:46:11
para organizar mejor
00:46:13
estos ejercicios
00:46:15
por ejemplo hasta ahora
00:46:17
hemos hecho un proyecto nuevo
00:46:19
por cada bloque
00:46:21
de ejercicios
00:46:23
pues ahora podríais hacer un único proyecto
00:46:25
que sea en ejercicio de java
00:46:27
y poner un paquete por cada uno
00:46:29
de los bloques de ejercicio
00:46:31
por ejemplo
00:46:33
y que más
00:46:39
entonces esto es para organización
00:46:43
de código
00:46:45
yo diría que
00:46:47
nos paramos por ahora aquí
00:46:49
y esto lo vemos el viernes
00:46:51
no es mucho
00:46:53
pero
00:46:55
- Idioma/s:
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 15
- Fecha:
- 13 de diciembre de 2022 - 14:35
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 46′ 57″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1280x720 píxeles
- Tamaño:
- 560.53 MBytes