Introducción a Java para principiantes | Worn Off Keys | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Introducción a Java para principiantes

teacher avatar Worn Off Keys

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      0:33

    • 2.

      Instalación de IntelliJ

      2:23

    • 3.

      Hola mundo

      5:46

    • 4.

      Comentarios

      1:20

    • 5.

      Variables

      6:57

    • 6.

      Entrada de usuarios

      3:59

    • 7.

      Operadores aritméticos

      4:41

    • 8.

      Si más si más

      7:28

    • 9.

      Declaración de cambiador

      3:25

    • 10.

      Operadores de comparación

      2:02

    • 11.

      Operador lógico

      3:20

    • 12.

      Mientras que bucles

      2:29

    • 13.

      Hacer mientras bucles

      2:28

    • 14.

      Para bucles

      1:56

    • 15.

      Romper y continuar

      1:45

    • 16.

      Proyecto de calculadoras

      7:01

    • 17.

      Métodos

      5:26

    • 18.

      Sobrecarga de métodos

      1:35

    • 19.

      Alcance

      2:18

    • 20.

      Operador ternario

      2:08

    • 21.

      Arrayas

      4:43

    • 22.

      Para cada bucle

      2:03

    • 23.

      Arrayas multidimensionales

      5:07

    • 24.

      Varargs

      2:38

    • 25.

      Constantes y fundición

      4:11

    • 26.

      Métodos comunes

      3:45

    • 27.

      Secuencias de escape

      2:18

    • 28.

      La clase de matemáticas

      3:55

    • 29.

      Variables de tipo de referencia

      8:39

    • 30.

      Fundamentos de programación orientados a objetos

      4:43

    • 31.

      Constructores

      3:12

    • 32.

      La palabra clave y propiedades

      4:19

    • 33.

      Encapsulación, abstracción, agarradores y configuradores

      7:07

    • 34.

      Herencia

      3:52

    • 35.

      Polimorfismo

      3:38

    • 36.

      La palabra clave "estática"

      4:07

    • 37.

      Clases abstractas

      3:20

    • 38.

      Interfaces

      3:21

    • 39.

      Instancia de

      1:40

    • 40.

      Enums

      7:23

    • 41.

      Prueba a captar por fin

      5:36

    • 42.

      Errores de lanzamiento

      2:15

    • 43.

      Listas y listas de arreglos

      6:25

    • 44.

      Mapas y mapas de Hash

      4:14

    • 45.

      Cómo crear un archivo de tarro

      3:07

    • 46.

      Proyecto de acorazado

      1:13

    • 47.

      Archivos y coordenadas

      2:33

    • 48.

      Barcos

      8:09

    • 49.

      Jugador

      10:50

    • 50.

      Cómo terminar el juego

      22:53

    • 51.

      Conclusión

      0:11

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

1801

Estudiantes

14

Proyectos

Acerca de esta clase

¿Tienes problemas para aprender programación con Java?

Cuando empecé a aprender Java en 2011 fue una pesadilla. Muchos conceptos e ideas nuevos para envolver mi cabeza.

Por eso he hecho este curso: crear un sistema sencillo paso a paso para aprender Java RÁPIDO.

Con múltiples proyectos y explicaciones claras, este curso te ayudará a dominar los fundamentos de Java incluso si nunca antes lo has programado.

Entonces, ¿qué estás esperando? ¡Empecemos!

Conoce a tu profesor(a)

Teacher Profile Image

Worn Off Keys

Profesor(a)

Hey! My name is Alexzander Flores and I'm a self-taught software developer. I started programming in 2008 and since then it has been a major part of my life.

I frequently used courses to learn a lot of what I know, so I'm now creating my own courses to help others in a similar way.

Ver perfil completo

Habilidades relacionadas

Desarrollo Lenguajes de programación Java
Level: Beginner

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. INTRODUCCIÓN: Java es uno de los lenguajes de programación más fáciles de aprender, lo que es perfecto para principiantes. En este curso, te voy a caminar a través programación y Java paso a paso. Al final de este curso, crearás a unos programas reales usando Java. Y tendrás una sólida comprensión de los fundamentos y fundamentos de programación. Programación de hornos en Java desde 2011. E incluso uso Java para crear mi propia startup de servidores de juego en esto y 14, hice un ingreso de tiempo completo de su proyecto por unos años antes de venderlo. Así que tengo mucha experiencia usando Java y estoy deseando compartir mis conocimientos contigo a lo largo de este curso. 2. Instalación de IntelliJ: Antes de que podamos aprender Java, necesitamos un lugar donde realmente podamos escribir y ejecutar nuestro código. Esto se conoce como un IDE, que significa Entorno de Desarrollo Integrado. Esa es una forma súper elegante de decir que es un editor de texto que también convertirá tu código en un programa real. Ahora el estándar de la industria para IDE y Java se va a llamar inteligencia. Por lo que simplemente puedes descargar inteligente de Google. Este es un software libre. Adelante y haz clic en el enlace superior aquí mismo, y asegúrate de seleccionar Community Edition. Y también seleccionan el sistema operativo correcto en el que estás. Estoy en Windows, que es el predeterminado. Así que me voy a quedar aquí en la pestaña de Windows. Entonces puedo hacer clic en Descargar. Y su descarga debe comenzar. Y en la mayoría de los navegadores que tendrán que estar de acuerdo en que quería descargar este archivo. Una vez que haya terminado de descargar, se puede hacer click en él aquí mismo. Aquí tenemos el instalador real. Este es un instalador bastante estándar. Bueno, sólo tienes que hacer clic en Siguiente alrededor de 800 veces y luego deberías estar bien para ir. Sólo voy a pasar y quedarme todo aquí, el defecto. Y luego voy a seguir adelante y pausar la grabación mientras la instalación está sucediendo. Después de que nos desinstalemos, podemos seguir adelante y dar click en esta casilla de verificación aquí mismo, y luego finalmente hacer clic en Finalizar. Una vez que lo abras, debes ser enviado a una página similar a ésta. Vas a querer hacer click en Nuevo Proyecto. Ahora en esta página quieres asegurarte seleccionaste Java en la parte superior. Ese debería ser el defecto. Y para el SDK del proyecto, podemos seguir adelante y seleccionar lo que sea el valor predeterminado. Pero si no ves un defecto, puedes descargar un JDK. Por lo que podemos hacer click sobre esto y puedes seleccionar la versión que quieras. Cualquier versión debe hacer. No vamos a estar haciendo nada. Eso es muy curso de proceso dependiente de versión. Simplemente haga clic en descargar. Ahora asumiendo que ya tienes un SDK, simplemente podemos hacer click en el siguiente y luego el siguiente de nuevo. Y luego finalmente podemos dar un camino a nuestro proyecto y un nombre. Podemos hacer click en los tres puntos aquí para navegar. Voy a seleccionar mi carpeta Java aquí mismo, y voy a crear una nueva carpeta. A éste se le llamará espacio de trabajo. Dentro de aquí. Sólo voy a seleccionarlo y luego haga clic en Okay. Ahora el nombre del proyecto por defecto es espacio de trabajo. Eso está bien. Voy a seguir adelante y haga clic en Finalizar. Ahora inteligente finalmente está abierto. A la izquierda aquí tenemos este proyecto el cual podemos tocar haciendo clic. Esto va a mostrar todos los archivos y carpetas dentro de nuestro espacio de trabajo. Ahora, en todas partes en este panel gigante aquí es donde se mostrará nuestro código. Pero no tenemos ningún código abierto en este momento. Pero ahora que la inteligencia se instala con éxito, estamos bien para ir y empezar a escribir algún código con el siguiente video. 3. Hello World: Ahora estamos listos para finalmente trabajar en nuestro primer programa Java. Y es una práctica común simplemente imprimir el texto hola mundo a la pantalla como tu primer programa, sin importar qué idioma o aprendizaje va a continuar eso aquí, navega hasta la carpeta fuente. Y aquí necesitamos hacer una nueva carpeta dentro de ella. Puede hacer clic con el botón derecho, ir a Nuevo y seleccionar paquete. Un paquete es básicamente sólo una carpeta. Y un programador Java usa paquetes, una forma de organizar todos tus archivos de código. Puedes tener varios archivos de código dentro de los paquetes y podrías tener múltiples paquetes dentro de tu proyecto. Por ahora, sólo vamos a trabajar con en un solo paquete. Así que adelante y clic izquierdo aquí. Ahora tenemos que introducir un nombre de paquete, y esto tiene que ser único. Ahora una práctica común es usar un dominio invertido. Por ejemplo, com.google.com.youtube. Pero obviamente, este no debería ser uno de los dominios populares, sino de su propio dominio. Y si no somos dueños de un dominio, no te preocupes, no necesitas hacerlo. Técnicamente puedes ingresar a lo que quieras. Pero por ejemplo, para seguir con las convenciones de nomenclatura estándar, hagamos algo así como com dot alex dot Flores o algo más por el estilo. Obviamente esto tiene mi nombre y podrías usar tu propio nombre si quieres o algo completamente inventado. Voy a nombrar a este paquete el dominio exacto que tengo. Entonces por ejemplo, com dot desgastado llaves. Ahora si presiono Enter, vemos que esta carpeta ha sido creada aquí mismo. Ahora dentro de aquí puedo crear mi propio archivo, así que puedo hacer clic derecho, ir a una nueva clase Java. Y aquí tenemos un par de opciones diferentes. Vamos a seguir con una clase estándar. Voy a explicar la diferencia entre todos estos en futuros videos. El nombre de clase que voy a llamar a este Hello World con una H mayúscula y una W mayúscula y sin espacios. Es muy importante que ninguno de estos archivos tenga espacios en sus nombres. Una vez que presiones Enter, tendrás algunas piezas de código escritas aquí mismo. Si amplías esta carpeta, ahora ves el hola de clase mundial aquí mismo. Ahora los detalles de lo que hacen cada una de estas cosas serán cubiertos en un futuro video. Por ahora, solo vamos a añadir a este código existente. Ahora si haces clic en este corsé rizado de apertura aquí mismo, puedes presionar Enter y puedes decir que estamos automáticamente con la pestaña. Y una vez ahora tabbing, es muy importante dentro cualquier lenguaje de programación porque hace que tu código sea mucho más fácil de leer. Y el beneficio de eso se hace mucho más evidente más adelante una vez que tengamos archivos mucho más grandes. Pero por ahora, no tenemos que preocuparnos por los archivos grandes. Nuestro objetivo en este momento es sólo imprimir el texto hola mundo a la pantalla. Ahora voy a escribir algún código. Adelante y sigue conmigo y tira esos rumbo. Vamos a entender lo que hace cada parte de este código. Pero la mayor parte de esto no se va a explicar en este momento. Para empezar, puedo decir público, estático, vacío, principal, y luego se deben generar automáticamente paréntesis y paréntesis finales. Y luego podremos poner un espacio y luego un corsé rizado, y similar a los paréntesis y terminando el corsé rizado se generará automáticamente. Ahora en medio de las dos llaves rizadas, si presionas Enter o C, También hubo fin tabulado una vez más. Tenemos que volver a los paréntesis y escribir cadena con un espacio S mayúscula. Después se agregará un corchete y un corchete final. Y luego podemos teclear arcos. Ahora acabamos de escribir mucho código y la mayoría de él te parece muy confuso. No te preocupes por eso en absoluto. Mientras tu código se vea así y no haya líneas rojas blandas en ninguna parte, entonces estás listo para ir. Y mis líneas rojas blandas, hice algo como esto. Aquí vemos esta línea roja ondulado aquí mismo. Esto es inteligencia para hacernos saber que hay un error en nuestro código. Pasamos el cursor sobre él. Se va a decir que un paréntesis final como se esperaba. Entonces puedo añadir uno aquí, y luego ese error desaparece. Nuevamente si estás confundido ahora mismo, no te preocupes, todo se explicará a medida que continuamos a lo largo del curso. El siguiente paso la explicará ahora mismo sin embargo, nuestro objetivo es imprimir algo a la consola. Podemos hacer esto escribiendo sistema con un mayúscula S, dot out, dot print LN. Podemos añadir un paréntesis y automáticamente se agregarán paréntesis finales. Dentro de aquí podemos sumar en una cotización doble y similar a todo lo demás, y terminando cotización doble se agregará. Ahora tenemos un error al final aquí. Si pongo el cursor sobre esto, vemos que se espera un punto y coma. Puedo añadir uno y aquí, similar a un periodo con una oración en inglés es punto y coma termina una declaración o una frase de Java. Al final de la mayoría de las líneas, vas a sumar en un punto y coma. Y podría haber notado que no tenemos un punto y coma aquí mismo en la línea seis o siete. El motivo de ello se explicará más adelante. Pero en general, la mayoría de las líneas de código que vas a escribir deberían tener un punto y coma al final. Ahora dentro de estas dobles cotizaciones aquí, podemos añadir en cualquier texto que queramos. Y como imprimimos en la consola, por ejemplo, puedo añadir en Helloworld. Entonces desde aquí puedo ir a Run en la parte superior, porque luego haga clic en Ejecutar aquí mismo. Alternativamente, puede utilizar un atajo que se muestra aquí. Tenemos este pop arriba aquí mismo. Queríamos hacer click en Hola mundo. Y ahora vemos que está construyendo. Ahora podemos simplemente hacer estallar aquí mismo. Voy a seguir adelante y bajar esta altura solo para que tenga más espacio para trabajar con el código. Pero sí vemos el texto Hola mundo, y que el proceso terminó con un código de salida de 0. El 0 de un ejecutivo básicamente significa que todo salió bien y no hubo problemas. Ahora si queríamos, podemos sumar en diferentes puntos de exclamación dentro de la cadena. Y en lugar de pasar por todas estas casitas abajo aquí, realidad podemos simplemente hacer clic en esta flecha verde cerca de la parte superior derecha. O puedes presionar Shift más F2, cualquiera que prefieras. Si hago click en esto, ahora vemos que va a reconstruir nuestro proyecto. Y ahora vemos Hello World con puntos de exclamación. Después. Ya has completado tu primer programa Java. Sé que mucho de este código parece muy confuso en este momento, pero todo se explicará medida que vayamos más allá. 4. Comentarios: Al programar, no podemos simplemente escribir nada que queramos porque este no es código Java válido. Y así si pongo el cursor sobre estos, estos van a decir que va a haber errores relacionados con este código. Pero a veces es posible que desee agregar notas diferentes o se le conoce correctamente como comentarios en su código. Esto ayudará a usted o a sus compañeros comprender mejor lo que está sucediendo dentro del código. Por ejemplo, puedo hacer dos barras delanteras aquí, y luego puedo decir print hello world a la consola. Ahora en este ejemplo exacto, probablemente no queremos agregar un comentario para esta línea porque la línea es bastante autoexplicativa de todos modos. Pero así es como se agrega correctamente en un comentario. Esto no tendría ningún efecto en el programa ni en lo que se imprime en la consola. Es justo ahí como nota para otros programadores y para ti mismo. Ahora a medida que avanzamos por este curso, vas a ver qué debería y no debería tener un comentario adjunto a él. Nuevamente, una línea como esta es muy autoexplicativa, por lo que no necesitamos agregar en ningún comentario. Ahora, alternativamente, podemos agregar en comentarios de varias líneas haciendo la estrella de barra inclinada hacia adelante. Y luego una estrella final barra hacia adelante e inteligente realmente hace el final por nosotros. Dentro de aquí puedo decir que esto es un comentario. Todo este texto aquí está en gris porque no es técnicamente código, sino más bien es un comentario. 5. Variables: Ahora vamos a hablar de posiblemente uno de los conceptos más importantes a la hora de programar. Y ese es el concepto de variables. Al igual que piensas en una variable como básicamente un contenedor que tiene algún tipo de valor. La memoria RAM o memoria de tu computadora es básicamente un montón de estantes que sostienen estos contenedores. Ahora, cada contenedor va a tener un nombre y el valor dentro se puede leer o cambiar en cualquier momento. Entonces, por ejemplo, vamos a crear un entero que es básicamente solo un número entero. Puedo decir int espacio. Y ahora tenemos que nombrar nuestra variable. Esto debería ser algo que sea descriptivo. No deberíamos tener variables nombradas a o X o cosas así que no sean muy descriptivas. Entonces en este caso, quiero que esto retenga mi edad actual. Entonces voy a escribir edad. Entonces estoy nombrando a esta edad variable. Puedes nombrarlo básicamente todo lo que quieras. Pero hay algunas reglas que voy a repasar más adelante en este video. Después vamos a sumar una señal igual. Y luego después del signo igual, podemos sumar en cualquier número. En este caso serán 28. Y luego finalmente, tenemos que sumar en un punto y coma lo que realmente está sucediendo aquí? Bueno, el int básicamente va a decirle a Java que queremos crear una variable, y esto va a contener un tipo entero de valor. Existen diferentes valores de variables que pueden contener y los cubriremos más adelante en el video. Ahora, cada variable necesita su propio nombre. En este caso, le damos el nombre de edad. Después tenemos un signo igual, que técnicamente se conoce como operador de asignación. Esto tomará el valor a la derecha y lo asignará a la variable de la izquierda. Y luego por supuesto que tenemos la edad y puedes sumar el número que quieras aquí. Podría ser 999, podría ser 0, podría ser negativo 5 mil. Cualquier número entero funcionará. Pero por simplicidad, solo voy a sumar en mi era actual, que es 28. Entonces, ¿qué podemos hacer realmente con esta variable? Bueno, lo más básico que podemos hacer es probablemente imprimirlo a la consola. En lugar de escribir la línea system.out.print cada vez, inteligencia realmente nos da un atajo porque esa es una línea bastante larga de código para escribir. Por lo que puedo escribir en S0 UT para sistema fuera. Si presiono Enter, generará automáticamente esta línea de código para nosotros. Ahora no genera las dobles cotizaciones y eso es intencional. Si tuviera que añadir en las comillas dobles y luego la edad a la que ejecutamos este programa, simplemente vemos la palabra edad y nuestra consola. Pero eso no es lo que queremos. Queremos ver el valor dentro de la variable edad. Tenemos que eliminar estas comillas dobles, por lo que no mostrará lo que se conoce como una cadena. Una cadena es básicamente como una frase o una colección de caracteres, algo que conforma algunos textos reales. Ahora sin las cotizaciones, se va a tratar de hacer referencia al valor dentro de la variable edad. En este caso, llegará a ese contenedor que mencioné antes, y sacará el valor de 28 para luego enviar eso al consumidor. Lejos nos atan otra vez. Ahora deberíamos ver 28 en la consola como lo hacemos aquí mismo. Ese es un ejemplo de lo que podemos hacer con variables. También podemos reasignar un valor. Por ejemplo, digamos que tengo un cumpleaños, podría decir que la edad es igual a 29 con un punto y coma. Observe cómo no uso el int aquí mismo. Cuando hago eso, hay un error. Si pongo el cursor sobre él, dice que ya se ha definido la edad variable. Entonces básicamente el int solo está ahí cuando estamos creando la variable. Pero después de que se crea, todavía podemos cambiar este valor reasignando un valor como este. Ahora para probar esto, puedo imprimir esto en la consola. Entonces OUT, podría imprimir la edad. Y si corro esto, ahora vemos 28 y también 29300. Entonces un entero es solo un número entero, pero hay varios otros tipos de variables. Por ejemplo, si elimino todo esto, ahora puedo decir cadena con un nombre S mayúscula es igual a Alex. Y nota cómo soy rápida dentro de comillas dobles. Si solo dijera Alex aquí, pensaría que estamos buscando una variable con ese nombre, pero no hay ninguna. Entonces para decirle a Java que estamos trabajando con una cadena de caracteres como una oración o un mensaje, algún tipo de texto. Entonces vamos a sumar nuestras dobles cotizaciones. Java no buscará una variable llamada Alex, sino que más bien trataremos esto como una cadena de texto. Ahora por supuesto podemos poner esto a la consola. Puedo imprimir nombre. Y si ejecuto esto, veremos a Alex en la consola. Pero hay muchos otros tipos de variables. Por ejemplo, tenemos un booleano. Jeff booleano representa un valor verdadero o falso. Eso es todo lo que hace. Entonces por ejemplo aquí, puedo decir que la programación es igual a verdad. Ahora cierto no está entre comillas porque eso técnicamente no es una cadena. True o false, que es la única otra opción para un booleano, son técnicamente palabras clave en Java. Podemos simplemente escribirlos dentro de nuestro código. Por ejemplo, si esto es cierto, ahora puedo imprimir es programación. Ahora si ejecuto esto, deberíamos ver true en la consola. Por supuesto, al igual que los enteros, podemos reasignar estudios de valor. Por lo que puedo decir es que la programación es igual a falsa. Y si ejecuto esto, ahora vamos a ver False dentro de la consola. Ahora voy a eliminar esta línea aquí. Y podrías notar cómo nombré su programación. Tengo un I minúscula y una P. mayúscula Dentro de nombres de variables, no podemos tener espacios. Entonces cada vez que tenemos varias palabras, es una práctica común usar algo conocido como notación CamelCase. La notación de camello es cuando se escribe una palabra con la primera letra mayúscula siendo minúscula en su lugar. Pero luego cada palabra después eso tiene una letra mayúscula al inicio. Esto hace que sea muy fácil de leer sin espacios. Compare eso con la notación de casos de camello. Esto obviamente es mucho más difícil de leer, especialmente para otras personas que solo están leyendo tu código y no lo escribieron. Entonces no saben exactamente lo que es. Otras reglas implicaban que las variables no pueden tener un nombre que sea difícil para el número. Normalmente, no deberías hacer esto de todos modos, por lo que eso no es muy descriptivo. Pero si por alguna razón absolutamente quieres, puedes agregarlo en un guión bajo para empezar. Luego se convierte en un nombre de variable válido. medida que avanzamos a lo largo del curso, verás más ejemplos de nombres de variables para que podamos tener una mejor idea de lo que es una buena convención de nomenclatura. Ahora pasemos a otros tipos de variables. A continuación tenemos un char, que es similar a una cadena, pero representa solo un solo carácter. Por ejemplo, puedo decir letra es igual a a. y estos usan cotizaciones simples, no dobles. Si iba a añadir en varios personajes aquí, no va a gustar y va a quejarse. Así que de nuevo, estos solo usan un solo carácter. También tenemos un doble, que es similar a un entero, pero por supuesto este va a ser cualquier número. No sólo tiene que ser un número entero. Por ejemplo, la edad es igual a 28.5. Este sería un doble válido, pero estoy usando el mismo nombre que una variable existente. Entonces voy a decir la edad como doble. Esa es otra regla para nombrar es que cada nombre tiene que ser único. De lo contrario no sabría qué variable estabas haciendo referencia exactamente. 6. Entrada de usuarios: Hasta ahora acabamos de imprimir cosas a la consola. Pero, ¿y si quisiéramos recibir aportaciones de los usuarios que están utilizando tu programa? En este caso, sólo seríamos nosotros. Pero y si queremos introducir ciertos números o nombres u otras cosas estilo y que en realidad se entienda dentro de nuestro programa DAW. Ahora para hacer esto, esto va a ser un par de conceptos. Habrá un poco confuso y mucho fuera del alcance de este video aquí. Estos son conceptos que se explicarán más adelante en el curso, pero son demasiado complicados para explicar en este momento. Así que adelante y codigo junto conmigo y ten en cuenta que estos se explicarán más adelante. Así que empecemos haciendo algo conocido como escáner. Esto es lo que se utiliza para recibir entrada dentro de nuestra consola. Para que pueda decir escáner con una S mayúscula, presiono Enter. Ahora vamos a importar escáner. Esto es algo que viene incorporado con Java, pero para utilizarlo dentro de este archivo, tenemos que importar todo ese código a este archivo. Eso es lo que hace esta línea de aquí mismo. Ahora que hemos creado un escáner similar a las variables que miramos en el último video. Tenemos que darle un nombre a esto. Voy a llamar a esta entrada. Entonces podemos usar un operador de asignación o un signo igual para asignar un nuevo valor a esto. Ahora, esto va a ser algo que se explicará mucho más detalle más adelante en el curso. Pero por ahora, solo adelante y codigo a lo largo. Aquí. Voy a decir nuevo escáner espacial con una S mayúscula y luego paréntesis después. Ahora recibo este error aquí. Cuando pongo el cursor sobre esto, dice que no puede resolver constructor Scanner. Nuevamente, el concepto de constructor y por qué se está produciendo este error, se cubrirá en un futuro video. Pero por ahora, dejemos ir dentro de los paréntesis a menos que agregue en un sistema con un punto S mayúscula n Esto debería deshacerse del error. Ahora estamos listos para empezar a recibir entradas desde la consola. Empecemos con una cuerda simple. Por ejemplo, puedo decir que el nombre de cadena es igual a punto de entrada siguiente. Y esto va a devolver una cadena por defecto. Entonces puedo imprimir los nombres de la consola. Así OUT y nombre. Y vamos a asegurarnos de que el usuario sepa qué hacer. Puedo decir S OUT, entonces puedo entrar. Por favor, introduzca su nombre. Ahora si ejecuto esto, vamos a ver por favor nombre anterior, pero no se cierra de inmediato como un dato y otras situaciones aquí realmente está esperando que ingresemos nuestro nombre. En este caso, agregaré un Alex, y si presiono enter, entonces imprimirá Alex. Y aquí es donde dice un proceso terminado. Los textos verdes serán los textos que entré y el texto blanco vendrá de un propio programa Java. Ahora si vuelvo a ejecutar esto, agregué mi nombre completo. Por ejemplo, Alexander espacio Flores. Si ejecuto esto, ahora sólo vemos a Alexander. Eso es porque la siguiente función aquí va a contar cada personaje hasta un cierto espacio en blanco. Entonces si hay un espacio o una pestaña o una nueva línea y cosas así lo van a hacer. Por lo que sólo dejará de buscar nuevos personajes y solo devolveremos lo que su encontró hasta ahora. Si queríamos conseguir la línea completa, podemos decir siguiente línea. Similar a variables, esto va a utilizar la notación CamelCase, lo que significa que tenemos una n minúscula porque es la primera letra de la primera palabra. Pero la primera letra de cada otra palabra. Por ejemplo, L, va a ser mayúscula. Si ejecuto esto, ahora puedo introducir mi nombre completo con un espacio, por lo que Alexander espacio para nosotros. Y si presiono Enter, vemos que la cadena completa ha sido impresa de nuevo a nosotros. Ahora no sólo tenemos que hacer cuerdas. Por ejemplo, puedo decir por favor ingrese su edad. Entonces aquí puedo decir int age es igual a punto de entrada siguiente. Y aquí vemos un montón de otras opciones. En este caso, queremos next int porque ese es nuestro tipo de variable, que es un int. Entonces puedo usar S0 UT. Podría imprimir edad sin cotizaciones. Y si yo dirijo esto, entonces nos va a pedir nuestra edad. En este caso, entraré 28. Entonces nos imprimirá 28 de nuevo. 7. Operadores aritméticos: A menudo cuando tenemos números, no solo queremos imprimirlos a la consola. Podríamos querer sumar, restar, multiplicar o dividir con esos números. Por ejemplo, puedo decir int number es igual a 50. Vamos a seguir adelante y empezar imprimiendo esto en la consola. Simplemente siempre podemos ver lo que está pasando. Ahora no voy a ejecutar esto porque es muy obvio lo que pasaría. Pero digamos que queremos sumar uno a este número. Un par de formas diferentes de hacerlo. Un ejemplo será el número igual a número más uno. Ahora si ejecuto esto, probablemente vas a saber qué se va a imprimir. En este caso será 51. Podemos sumar diez o un 100 o cualquier otro tipo de valor. Lo que queremos a este intruso. Ahora hay una forma más corta de hacer esto. Por lo que voy a usar la slash de control hacia adelante para seguir adelante y comentar la línea actual. Y entonces voy a decir número más igual a 100. Esto es básicamente lo mismo exacto que lo que tenemos aquí mismo, es sólo una forma más corta de agregar un número a una variable. Entonces si ejecuto esto, vamos a ver 150 en la consola. Podemos hacer el mismo concepto exacto cuando se trata de resta. En lugar de plus, tengo menos. Y si ejecuto esto, vamos a ver 50 negativos en la consola. Por supuesto que tenemos multiplicación. Entonces si corro esto, aquí vemos 5 mil y división, que tiene una rebanada hacia adelante. Si ejecuto esto, vamos a ver 0. Ahora el 0 aquí es porque estamos usando enteros que son números enteros. Si tuviera que cambiar este int a un doble, lo que permite puntos decimales, y yo fuera a ejecutar esto. Ahora vemos 0.5. Y por supuesto todos estos símbolos se pueden utilizar en esta sintaxis original. Por ejemplo, podemos decir dividirlo por 100 veces 100. Cualquier cosa así seguirá funcionando. Ahora tal vez te estés preguntando, ¿por qué alguien que use este tipo de sintaxis si esto es simplemente más corto? El motivo principal para usar este tipo de sintaxis aquí es porque si tienes múltiples variables, entonces esta era la única forma de hacer las cosas. Por ejemplo, puedo decir int número dos es igual a diez. Entonces puedo decir que el número equivale al número dos veces 100. No podemos hacer eso con este tipo de sintaxis aquí, porque este tipo de sintaxis sólo va a modificar la variable mencionada en este caso, eso será número. Ahora voy a eliminar la mayoría de las cosas y voy a crear otro entero llamado número igual a cinco. Ahora digamos que queremos sumar o restar una de esta variable con lo que acabamos de ver, podríamos hacer número más igual a una. Si ejecuté esto, claro que es una especie de trabajo. Veríamos seis en la consola. Pero aumentar y disminuir un número uno es tan común que la mayoría de los lenguajes de programación, incluido Java, tienen una forma de hacerlo, una sintaxis aún más corta. Esto se conoce como incrementar y disminuir un valor. Por lo que puedo decir número plus, plus. Si guardo esto, todavía vamos a ver seis en la consola. Esto va a aumentar el número en uno. También podríamos hacer número menos menos. Si ejecuto esto, vamos a ver cuatro en la consola porque estamos restando del número original, que en este caso es cinco. Ahora las máses y contras pueden continuar ya sea asignadas a la variable, y hacen cosas un poco diferentes. En este caso de uso, si fuera a ejecutarlo, vamos a ver ningún cambio real. Y todavía vamos a ver seis en la consola. Pero eso es sólo por cómo se escribe aquí nuestro código. Tener las máses antes o después será mucho más claro en la diferencia. Si agrego las pluses directamente en la variable aquí mismo, si ejecuto este pincel todavía va a ver seis en la consola. Eso se debe a que las más antes del nombre de la variable, primero va a incrementar la variable y luego usarla. Utilizando, en este caso, lo pasamos a la función de línea de impresión, básicamente imprimiéndola a la consola. Pero si fuera a añadir más después, eso significa que primero vamos a usar la variable y luego aumentarla. Si fuera a ejecutar esto, vamos a ver cinco en la consola. Pero técnicamente en la memoria de nuestro programa, número aún mantiene el valor seis. Simplemente no lo imprimimos. Para probar esto, puedo imprimir de nuevo esto. Consulta nuestro número de impresión. Y si corro esto, entonces vamos a ver 56. El mismo concepto exacto se aplica cuando se trata de menos, menos. Si voy a correr esto, vamos a ver cinco y luego cuatro. Ahora claro, si hago menos, menos antes, entonces vamos a ver 44. Eso es porque primero estamos disminuyendo en el número y luego usándolo. Entonces por supuesto que sólo estamos imprimiendo los resultados de nuevo. medida que avanzamos hacia el curso, vas a ver una serie de diferentes formas e instancias en las que esto va a ser útil de usar. Sobre todo cuando se trata de nuestro primer proyecto, que estará a la mitad del recorrido. 8. Si más es: Ahora estamos a punto de sumergirnos en un concepto muy importante conocido como flujo de control. El flujo de control es básicamente donde llegamos a controlar el flujo del programa quién habría adivinado. Y esto se hace más comúnmente con algo conocido como declaraciones IF. Básicamente, si algo equivale a algo, entonces vamos a ejecutar una cierta pieza de código. De lo contrario, tal vez no pensemos en un juego de disparos favorito. Si presionas el botón Recargar, se va a comprobar si tienes una Magdalena completa. No Si lo hace no es entrar en recarga. Pero si no tienes una revista completa, entonces se recargará. Empecemos creando alguna entrada de usuario, llamando crear un escáner. Voy a llamar a esta entrada. Voy a asignar el valor de nuevo escáner pasando en el sistema dot n Ahora que tenemos acceso a este objeto de entrada, en realidad podemos leer la entrada del usuario. Así que voy a decir int number es igual a punto de entrada siguiente int. Ahora voy a simplemente imprimir esto para asegurarme de que todo esté funcionando. Muy bien, Mike, y ejecuta esto con turno y FTN. Aquí está esperando que introduzca un número. Voy a entrar 50 y luego nos quedan 50 impresos de nuevo. Todo está funcionando bien. Pero en lugar de simplemente imprimir el número, voy a usar una declaración if. El sintaxis para una declaración if sería si paréntesis, y luego un corsé rizado y un corsé rizado final en la siguiente línea. Ahora dentro de los paréntesis es donde va nuestra condición. Y esta condición va a ser típicamente comparando los dos. Gracias. Por ejemplo, puedo decir el número dos es igual a signos, 52 iguales a signos es muy importante porque un único signo igual, como mencioné antes, es un operador de asignación. Esto tomará el valor a la derecha y lo asignará a la variable de la izquierda. Pero dos signos iguales es una comparación. Esto va a ver si el valor de la izquierda, llama al valor a la derecha. Voy a añadir en un comentario aquí dice comparación. Ahora, ¿qué pasa si estas dos cosas son iguales? Bueno, esto básicamente se convertirá en una expresión booleana. Y si lo recuerdas antes, un booleano es igual ya sea verdadero o falso, no hay otros valores de Boolean que pueda usar declaraciones IF y habitar condicional como este básicamente va a buscar un booleano valor. Hipotéticamente, déjame comentar esto y déjame entrar en el número 50. Ahora en este caso, nuestro editor de texto nos da esta advertencia amarilla al pasar el cursor sobre ella. Dice que el número de condición es igual a 50 es siempre cierto. Ahora, obviamente ese es el caso porque nuestro valor aquí mismo es 50 y eso nunca cambia. Ahora, la parte importante aquí es que siempre es cierto, que es un valor booleano. Entonces esto es básicamente lo mismo que decir si es verdad. Ahora bien, si este es el caso, entonces siempre se ejecutará el código dentro de estas llaves rizadas. Si esto fuera falso y el código dentro de los tirantes rizados nunca se correrá. El estado dentro de los paréntesis debe ser una verdadera condición. Voy a usar Control Z para retroceder hasta aquí donde realmente estamos recibiendo la entrada del usuario. Y dentro de aquí voy a simplemente imprimir a la consola diciendo que el número es 50. Ahora voy a deshacerme de algunos de estos comentarios aquí, sólo para hacer nuestro código un poco más limpio. Voy a tratar de correr con turno y F2. Y aquí se espera que introduzca un número. Si entro 50, va a decir los números 50. Y si vuelvo a correr esto, entro a cualquier otra cosa. Por ejemplo, 99. No va a imprimir nada porque esta condición es falsa. Por lo tanto, el código interior no se ejecutará. Pero, ¿y si quisiéramos revisar otros números? Will en teoría, podríamos simplemente agregar un montón de declaraciones if. Por ejemplo, un número exactamente igual a 51. Pero, ¿y si solo queremos que se imprima una cosa a la consola? Ahora cada vez que creamos una declaración if, esto va a crear algo conocido como una cadena de sentencias if. Una cadena de declaración if. Esto va a contener hasta tres tipos diferentes de declaraciones. Tenemos nuestras declaraciones if, tenemos nuestras declaraciones de else-if, y tenemos nuestras declaraciones else-if. Echemos un vistazo a las declaraciones else-if. Si me deshago de esta declaración if aquí, entonces podría decir otra cosa, si el número es exactamente igual a 51, entonces puedo imprimir el número es 51. Ahora una declaración else-if tiene que ser directamente después de una declaración if. Estos básicamente mirarán todas las declaraciones anteriores if y else-if. Y si todos son falsos, entonces seguirá adelante y tratará de comparar estos dos valores. En este caso, declaración IF en línea 16, se va a comparar el número 50. Si eso es cierto, entonces vamos a ejecutar este código. Y luego vamos a saltar hacia abajo a aquí mismo. En realidad no vamos a intentar ni comparar el número de 251 porque la declaración else-if ve que la declaración if era verdadera. Se ve que no tiene sentido ni siquiera comprobar los dos valores. Pero si entramos un número diferente, por ejemplo 51, esta condición ahora es falsa. El enunciado else-if, veremos que entonces intentará comparar estos dos valores. En este caso, los dos valores son los mismos. Entonces este código corrimos, pero si entro 52, nada aquí será rampa. Para probar esto, puedo ejecutar nuestro programa. Puedo entrar 50. Aquí vemos los números 50, extranjeros lo ejecutan de nuevo. Puedo entrar un 51, y aquí vemos el número es 51. Por último, puedo ejecutarlo y puedo entrar 52 y no pasa nada. Ahora para cada cadena de declaraciones IF, por ejemplo, esto aquí mismo, podemos tener solo una declaración if, pero tantas afirmaciones else-if como queramos. Por ejemplo, puedo decir más si el número es exactamente igual a 52, entonces podría imprimir el número es 52. Y para hacer las cosas un poco más interesantes, puedo decir lo contrario f-number es exactamente igual a 52. Nuevamente, no pude imprimir prueba solo para asegurarme de que esta declaración impresa sea muy diferente a las demás. Entonces si ejecuto esto, entro 52 en la consola. Ahora vemos que el número es para los dos, pero no vemos texto. Eso es porque esta condición aquí era cierta. Por lo tanto, esta afirmación else-if no va a molestar ni siquiera a comparar estos dos valores y ciertamente no imprimirá nada dentro de las llaves rizadas. Ahora claro, nuestro IDE se está quejando porque estas dos cosas en realidad no deberían estar aquí. Esta declaración aquí en realidad nunca se ejecutará sin importar qué. Porque si el número es 52, entonces este código aquí mismo en la línea 21, corrimos en su lugar, porque nuestra condición en línea 20 será cierta. Voy a quitar esto. Y lo final que quería mostrarte es la declaración otra. Esto tiene que estar al final de una cadena de declaraciones if. Esto es básicamente sólo un catch-all. Si nada más en la cadena de sentencias if era verdadera, por ejemplo, puedo imprimir un número desconocido y puedo ejecutar esto. Y si entro al 5352, sabemos lo que va a pasar. Pero, ¿qué pasa si entro 53? Dice número desconocido porque los tres de estos si declaraciones aquí mismo o falsas, por lo tanto la otra declaración que corrimos. Pero si fuera a correr esto y quiero ingresar 52, entonces dice que el número es para los dos. Y la declaración else no se corrió porque ve o una de las anteriores declaraciones f o else-if eran ciertas. Básicamente el programa va a pasar por todos estos e intentar encontrar las primeras declaraciones verdaderas e ignorar todo lo demás. 9. Declaración de cambiador: En el último video, echamos un vistazo a las declaraciones if, pero eso es solo un ejemplo de control-flujo. Otro ejemplo va a ser algo conocido como sentencia switch. Ahora esto se usa menos comúnmente como si las declaraciones, pero lo verá de vez en cuando. Entonces es importante entender cómo funciona. Simplemente puedo decir cambiar paréntesis y luego llaves rizadas después. Ahora los paréntesis de anticuerpos va a ser un valor, no necesariamente una condición, sino cualquier tipo de valor. Por ejemplo, en este caso un número. Ahora dentro, básicamente vamos a tener algo conocido como declaraciones de caso, que son algo como si afirmaciones. Puedo decir caso 50 con un colon. Si presiono Enter, entonces podría añadir en el número es 50. Entonces tengo que añadir en algo conocido como una declaración de break. Voy a seguir adelante y correr esto con Shift F2. Dentro de aquí, puedo ingresar el número 50, eso va a decir los números 50. Ahora si vuelvo a ejecutar esto, entro a cualquier otra cosa. Por ejemplo, 51. En realidad no va a pasar nada porque obviamente no estamos manejando 51 en ninguna parte. Esto es diferente a una declaración if y tenía sus propios casos de uso. En realidad se usa más comúnmente para mi experiencia al comparar cadenas, pero puedes usarlo en lugar de si afirmaciones si realmente queríamos. Pero hay más a esto. Por ejemplo, puedo añadir en más casos. Por lo que caso 51, puedo sumar. El número es 51 y puedo romper. Ahora claro, si ejecuto esto y agrego en 51, solo dirá eso. Pero, ¿qué pasa si quiero comprobar dos números diferentes? Bueno, también puedo decir caso de 52. Y entonces la declaración impresa dirá que el número es 51 o 52. Ahora si corro esto, entonces puedo seguir adelante y entrar en 52. Dice que el número es 51 o 52. Por supuesto que obtendremos la misma salida si entro el número a uno. Ahora la capacidad de comprobar dos valores diferentes con una declaración if se explicará en algunos videos del curso. Es mucho más fácil explicar eso con declaraciones switch. Entonces por eso lo estoy cubriendo aquí. Una cosa a tener en cuenta, tiene básicamente si alguno de los casos es cierto, el código seguirá funcionando hasta que se encuentre una declaración break. Por ejemplo, puedo cambiar esto al número es 52. Entonces puedo imprimir el número es 51 justo aquí. Observe cómo no tenemos una declaración de descanso después de esta declaración impresa aquí mismo. Esto de aquí mismo es el único lo rompe cuando tenemos cuatrocientos cincuenta uno y cincuenta y dos. Entonces si ejecuto esto y heredo 51, lo que va a pasar es que seguirá ejecutando el código hasta que encuentre una declaración break. Vemos que el número es 51. No le importa si hay un caso aquí. Sólo va a ignorar eso. Y va a correr esta línea justo aquí, el número para los dos, y luego vamos a romper. Ahora una última cosa para las sentencias switch va a ser por defecto, que es algo que normalmente va al final. Y esto es algo así como la declaración else para si declaraciones. Aquí puedo imprimir número desconocido. Y técnicamente no necesitas una declaración break a pesar de que mucho va a argumentar que es sintaxis adecuada. Pero el código funciona bien incluso sin una declaración break, porque por supuesto, el valor predeterminado debería ser el último caso que su cheque dentro de su sentencia switch. Si voy adelante y ejecuto esto e ingreso cualquier otro número, por ejemplo, negativo 500. Entonces vemos número desconocido. Las sentencias Switch son bastante simples y se pueden usar en lugar de declaraciones if y algunos casos de uso. Pero típicamente solo vas a estar usando declaraciones if. 10. Operadores de comparación: Ahora vamos a saltar de nuevo a si declaraciones y echar un vistazo a los operadores de comparación. Estas son diferentes formas en las que podemos comparar dos valores. Anteriormente, tuvimos que mirar al signo doble igual, que simplemente comprobará el valor de la izquierda y lo comparará con el valor de la derecha. Pero hay muchos más operadores que podemos usar dentro de Java o prácticamente cualquier lenguaje de programación. Por ejemplo, tenemos un signo mayor que. Hubo menos que signo. Tenemos mayor que o igual a y tenemos menos que o igual a. Y también tenemos un no igual a. Ahora la mayoría de estos son muy autoexplicativos. Pero echemos un vistazo a algunos ejemplos. Como digo, si el número no es igual a 50, entonces puedo imprimir el número su no 50. Y si corro esto y entro 50, claro que no vamos a ver nada porque el número hace igual a 50. Por lo tanto, esta condición aquí mismo es falsa. Pero si vuelvo a correr esto y entro cualquier otra cosa, Por ejemplo, uno, vemos que el número no es 50 porque claro, uno es lo mismo que 50. Ahora probemos algunas otras cosas. Por ejemplo, puedo decir que el número es mayor que 50. También puedo el número es mayor a 50. Y si ejecuto esto, ahora puedo ingresar cualquier número que quiera, por ejemplo, 900. Y dirá que el número es mayor que 50. Pero si entro algo menor o igual a 50, entonces no va a pasar nada. El igual a parte es importante porque 50 no es mayor que 50. Es igual a ella. Si entro 50, no se va a imprimir nada. Si quisiera esa funcionalidad, puedo decir mayor que o igual a 50. Si ejecuto esto y entro 50, claro, ahora vamos a ver que el número es mayor que 50. Pero eso es sólo porque no actualizé este texto. Pero la parte importante aquí es que el número es ahora un mayor que o igual a 50. Y por supuesto, los operadores menos signos trabajarán exactamente de la misma manera. Estoy seguro de que se pueden imaginar cómo funcionarán esos y podemos usarlas para tener expresiones más complicadas dentro de nuestras declaraciones if para entonces tener unos programas más complejos y más significativos. 11. Operador lógico: Echemos un vistazo a los operadores lógicos. Estas son otras formas de sumar controles más complicados dentro de nuestras declaraciones if. Por lo que algunos ejemplos de esto será el operador NO. Este también será el operador lógico Y. Y el operador lógico OR, que es pulsando la tecla Mayús y presionando la tecla anterior, enter. El operador NOT va a básicamente simplemente revertir un valor. El operador AND básicamente se asegurará que esa cosa a la izquierda y que las cosas de la derecha sean ciertas. El u operador se asegurará de que esa cosa a la izquierda o a la derecha o ambas sean ciertas. Echemos un vistazo a todos estos con ejemplos. Puedo decir si el número exactamente igual a 50, número es exactamente igual a 55, entonces puedo imprimir 50 o 55. Y si corro esto, ahora puedo entrar 50 y vemos 50 o 55 corriendo esto de nuevo, entrando 55, vemos lo mismo. Y por supuesto, si ejecuto esto y entro a cualquier otra cosa, por ejemplo, 70, no vemos nada en la consola. Básicamente, esto quiere ver que el lado izquierdo del operador u, o el lado derecho, o ambos son ciertos. Y podría ser obvio porque este es el operador lógico OR. Permítanme seguir adelante y añadir en lo que significan estos. El operador lógico OR va a ser éste o aquello, cualquiera de los dos. Ahora el operador AND tendrá demasiado sentido en este caso de uso, porque la variable numérica no puede contener un 5055 al mismo tiempo. Mejor ejemplo del operador AND es cuando se usa mayor que y menor que. Entonces, por ejemplo, podría decir número es mayor o igual a 50 y el número es menor o igual a 55. Por lo que debe incluirse cualquier cosa del 50 al 55. Voy a cambiar esto a 5255. Y si ejecuto esto, ahora puedo entrar 52. Y vemos que esto es cierto. Esencialmente si el número es mayor que o 50 y el número es menor que o 55 que la totalidad si la declaración será verdadera. Si alguna de estas dos expresiones es falsa, entonces la declaración if será falsa. Por ejemplo, si ejecuto esto una vez más y entro 56, realidad no va a pasar nada. Si bien esta parte de aquí mismo es cierto, porque 56 es mayor o igual a 50. Es falso aquí mismo, porque para los seis no es menor o igual a 55. Y el y operador requiere tanto una izquierda como la derecha para ser verdad. Ahora echemos un vistazo a un operador NOT, que básicamente sólo va a revertir una expresión booleana con un if afirmaciones, en realidad podemos emparejar ciertas condiciones juntas. Por ejemplo, puedo envolver unos paréntesis alrededor de todo este asunto. Y si yo fuera a ejecutar esto, sucedería lo mismo. Pero ahora podemos usar un operador NO o de antemano. Toda esta expresión será verdadera o falsa dependiendo si el valor de número es el operador NOT simplemente va a revertir eso. Entonces voy a decir que no 5255. Si ejecuto esto, entonces podría ingresar 52. No pasa nada. Pero si vuelvo a correr esto y entro cualquier cosa que no esté entre 5055, por ejemplo, los 34, vemos no 5255. El operador NOT simplemente va a revertir una expresión booleana. Y a lo largo del curso vamos a ver más casos de uso del operador no y de los otros dos operadores también. Y lo útiles que pueden ser. 12. Bucles: Ahora vamos a ver el ejemplo más sencillo de un bucle. Y esta es una manera de que ciertas piezas de código sigan corriendo una y otra vez mientras queramos que se corran. Entonces hay algunos tipos diferentes de bucles. Pero en este video vamos a echar un vistazo al bucle while. Por lo que podemos decir Mientras paréntesis y luego llaves rizadas. Y dentro de esta condición va a haber una expresión booleana. Esto va a ser verdadero o falso para si este bucle debe seguir ejecutándose. Por ejemplo, puedo hacer un entero llamado contador y establecer esto igual a 0. Entonces podría decir, mientras el contador es menos de diez, entonces puedo ir dentro del bucle while y todo dentro los tirantes rizados se correrá siempre y cuando esta condición aquí mismo sea cierta. Ahora actualmente esto se conocería como un bucle infinito porque el contador nunca está cambiando. Siempre es 0. Entonces contador de elevación y estaño siempre es cierto. Queremos asegurarnos de que realmente cambiamos el estado de contador, donde ser diez o mayor es una posibilidad. De esa manera no nos quedamos atrapados en un sueño para siempre. Haz eso. Voy a imprimir primero qué es el contador, como. Digo contador, espacio de colon. Y luego fuera de la cuerda, podría hacer más contador. Esto agregará el contenido de la variable contador a la cadena general que se ha pasado a la función de línea de impresión. Ahora después puedo decir contador plus plus. O si realmente quisiera, podría poner esto aquí mismo. como aprendimos antes, poner el plus, más a la izquierda del nombre de la variable primero lo incrementará y luego lo usas. Utilizando, en este caso, lo imprimimos en la consola. Entonces antes de correr esto, repasemos lo que acabo de hacer. Creé una variable entera con un valor de 0. Y estamos diciendo si bien esa variable es menor de diez, vamos a ejecutar todo el código dentro de estas llaves rizadas. Ahora este código simplemente simplemente imprime contador. Pero antes de que en realidad imprimimos contador, vamos a aumentarlo en uno. Esto significa que nuestro bucle ya no es infinito porque la primera vez que esto se ejecuta, va a imprimir uno, luego dos, luego tres, y así sucesivamente hasta que llegue a diez, donde contador menos que estaño ya no estaría verdadero. Para entonces podemos salir de nuestro bucle y continuar con el resto de nuestro programa. Veamos esto en acción. Puedo hacer Turno F2. Debería ejecutar nuestro programa. Y si expando esta ventana, ahora vemos contador uno todo el camino a través de diez. Este es un ejemplo muy simple de un bucle. Básicamente, si bien esto es cierto, vamos a ejecutar todo el código dentro de las llaves rizadas. 13. Haz en bucles: Ahora echemos un vistazo al bucle do while. Esto es similar al bucle while, pero es un poco menos comúnmente utilizado. vendrá la sintaxis con nosotros, luego llaves rizadas. Y luego al final rizado corsé diríamos mientras que con nuestros paréntesis y un punto y coma. Ahora la condición se va a poner dentro de esto aquí mismo. Básicamente el concepto aquí es que vamos a ejecutar este bloque de código de inmediato, pase lo que pase. Entonces después básicamente se va a convertir en un bucle normal while. Vamos a seguir ejecutando ese bloque de código mientras esta condición es cierta. Pero no importa cuál sea este bloque de código que ejecutamos al menos una vez, eso es diferente a un bucle while, donde este código de gancho de bloque solo se ejecuta incluso la primera vez, solo si la condición es verdadera. Ahora un caso de uso práctico para esto es recibir la entrada del usuario y asegurarnos de que obtenemos el tipo correcto de entrada o un número correcto. Por ejemplo, puedo decir que la entrada del escáner es igual a nuevo escáner. Puedo pasar en sistema dot n. Y entonces aquí voy a decir número int. No voy a asignarle un valor. Y eso es algo que podemos hacer con variables. Podemos crearlos, pero no tienes que asignarles un valor de inmediato. Ahora dentro del bloque do de código aquí mismo, voy a decir que el número es igual a punto de entrada siguiente int. Entonces voy a decir mientras el número es menor a diez. Entonces esencialmente lo que este código va a hacer es que primero vamos a recibir alguna entrada del usuario. Vamos a crear un número que vamos a usar más adelante. Y luego vamos a ejecutar este código. No importa cuál sea la condición del paseo , siempre corre una vez. Entonces esencialmente vamos a recibir entradas del usuario, idealmente un número. Y entonces vamos a seguir corriendo esto mientras esta condición aquí sea cierta. Por lo tanto, tenemos que proporcionar un número que sea diez o más para que realmente reciba insumos válidos. Ahora, después voy a imprimir el número. Voy a correr esto con turno y FTN. Ahora dentro de aquí, puedo entrar lo que quiera. Por ejemplo, cinco o siete. Cualquier cosa menos de diez será ignorada por completo porque el bucle while continuará haciendo que este bloque de código aquí mismo se ejecute una y otra vez hasta que esta condición sea falsa. Incluso puedo entrar 5 mil negativos, por ejemplo, y todavía va a seguir funcionando. Pero en cuanto entre algo diez o mayor, por ejemplo, 84, se va a salir de ese bucle, y va a imprimir 84 aquí mismo. 14. Para bucles: Echemos un vistazo al bucle más poderoso, que se conoce como el for-loop. Esta es la mejor manera de contar las cosas o iterar sobre una lista de ciertos elementos. Eso podría sonar confuso, pero a lo largo del curso verás ejemplos de eso. Por ahora, simplemente intentemos contar algo. En el ejemplo anterior, creé un contador y luego usó un bucle while para seguir adelante y contar sobre eso. Podemos usar un for-loop para lograr esto y de una manera mucho más limpia. Por ejemplo, puedo decir por paréntesis, llaves rizadas. Y dentro de los paréntesis van a haber tres elementos diferentes que se van a separar por punto y coma. El primero va a ser la inicialización. Aquí es donde realmente podemos crear variables que se pueden utilizar con nuestro bucle. Por lo que puedo decir int contador es igual a 0. El segundo va a ser una condición similar a un bucle while o do-while. Esto será si el bucle debe seguir funcionando. En este caso, voy a decir contador menos de diez. Entonces después, esta última sección va a ser código que ejecutamos cada vez que se complete el bucle. En este caso, queremos decir plus plus contador. Entonces cada vez vamos a aumentar el contador en uno. Ahora dentro de aquí simplemente voy a imprimir contador a la consola. Y si corro esto con turno y F2, deberíamos ver un recuento de 0 a nueve, como vemos aquí mismo. Todavía en el bucle. Primero comienza, crea esta variable solo una vez. Entonces asientos si esta condición es cierta, si es así, no se ejecuta todo el código dentro de nuestras llaves rizadas aquí, simplemente simplemente imprime 0 en la consola como vemos allí. Entonces una vez que llega al final, se da cuenta de que no queda nada que hacer. Por lo que va a bucle atrás. Al hacer que aumenta contador aquí. Esa gnosis, ese contador es ahora 11 es menos de diez. Tan lindo repitiendo el proceso hasta que esta condición sea falsa, que vemos aquí mismo. Porque una vez que son nueve y aumenta a diez, la condición ya no es cierta. Por lo tanto, salimos del bucle. 15. Rompe y continúa: Echemos un vistazo a la ruptura y las palabras clave continue con cómo mirar break dentro de las sentencias switch. Y funciona de manera similar aquí. Pero estas son dos palabras clave que se pueden usar dentro de cualquiera de los tipos de bucle. Por ejemplo, puedo decir int contador es igual a 0, mientras que el contador es menos de diez. Ahora aquí primero voy a aumentar contador y luego voy a imprimirlo a la consola. Pero digamos que fui a saltarme el número cinco después de aumentarlo. Pero antes de imprimir a la consola, como dije, si contador es exactamente igual a cinco, ahora puedo continuar y continuar o básicamente simplemente saltarse todo lo demás en un bucle y simplemente volver al inicio de el bucle. Seguirá revisando el estado. Pero todo pasó esta declaración continua aquí, bueno, básicamente ser ignorado en este caso es sólo esta línea aquí. Esencialmente, una vez que golpeemos esto, solo vamos a saltar de nuevo hasta el inicio y ellos siguen haciendo bucle normalmente desde ahí, voy a presionar Shift y F2 para ejecutar el código. Y aquí vemos uno a diez, pero faltan cinco. Vemos 46 inmediatamente después. Esa es la palabra clave continue. Saltará automáticamente de nuevo al inicio del bucle. Ahora echemos un vistazo a la palabra clave break. Algunos de ustedes ya podrían adivinar qué va a hacer esto. Esencialmente, en lugar de simplemente saltar de nuevo al inicio, si va a salir del bucle por completo. Si ejecuto esto, vemos uno a cuatro porque una vez alcanzado cinco, inmediatamente se va a romper y empezar ejecutar el código fuera del bucle while. Puedes usar estas dos palabras clave para tener un mejor control sobre tus bucles y qué se ejecuta y cuándo salir de ellos. Y ambas palabras clave aquí funcionan en cada bucle en Java, incluyendo los tres tipos que hemos visto hasta ahora. 16. Proyecto de calculadora: Pongamos en Estados Unidos todas las habilidades que hemos aprendido hasta ahora. Hagamos nuestro primer proyecto. Sólo vamos a ser una simple calculadora. Ahora, la mayoría de las cosas que has aprendido hasta ahora se aplicarán directamente dentro de este proyecto. Lo que este proyecto está diseñado para seguir siendo difícil si eres nuevo programación cuando iniciaste este curso por primera vez. Si te encuentras con algún problema o estás luchando con este proyecto que se espera y no te preocupes, hay tres cosas principales que quería hacer cuando se trata de este video. El primero va a estar repasando un plan. Al diseñar cualquier programa, incluso solo una simple calculadora, es importante tener un plan y una idea general de lo que quieres hacer antes de empezar a escribir código. Lo segundo es que quiero que lo pruebes por tu cuenta. Entonces te voy a mostrar paso a paso cómo nos haría. Pero antes de que yo haga eso, quiero que detenga este video e intente hacerlo por su cuenta después de repasar un plan. Si bien cursos como este ayudan, la mejor manera de mejorar en la programación es el código correcto. Te animo encarecidamente a que llegues tan lejos como puedas por tu cuenta antes ver cómo aplicaría esto. Ahora la tercera cosa va a ser, te mostraré cómo hice este programa. Después de que hayamos diseñado nuestro plan juntos y después de que hayas intentado hacer esto por tu cuenta, te voy a mostrar cómo haría este programa. Empecemos con el paso uno, repasando un plan. ¿ Qué debe hacer este proyecto? ¿ Y qué tenemos que hacer para lograrlo? Bueno, lo primero es que debe pedir dos números. Entonces debería preguntar, o una operación matemática. Esto será un plus, menos multiplicación o división. Entonces sería uno de estos cuatro personajes. Después, necesitamos mostrar el resultado y luego volver al inicio del programa donde pedimos números. Este es un plan muy, muy básico cuando se trata de este proyecto. Algunas de estas cosas deberían ser simples. Otras cosas requerirán que pienses, tal vez incluso volviendo a lecciones anteriores. Nuevamente, intente pausar este video ahora mismo y llegar lo más lejos que sea posible su cuenta y luego regrese una vez que haya completado un proyecto o una vez que su 100% atascado y no puede llegar más lejos. Y te mostraré paso a paso cómo haría este programa. Ojalá ya lo hayas probado por tu cuenta. Ahora, sigamos adelante e implementemos cada uno de estos pasos. Pero nuestro plan aquí muestra un uso importante de leer todas las instrucciones. Por ejemplo, aquí vemos, volveremos al inicio del programa. Eso significa que todo este programa podría estar dentro de un bucle while. Puedo decir mientras es cierto. Ahora este será un bucle infinito que se ejecutará para siempre, lo cual está bien para este caso de uso. Ahora va a decir que debería pedir dos números. Así que voy a empezar simplemente haciendo un escáner llamando entradas, configurando esto igual a un nuevo escáner que pasa en el sistema dot n Entonces voy a imprimir enter el primer número. Entonces voy a decir int número uno es igual a punto de entrada siguiente int. Hasta ahora hemos pedido un número. Hagamos básicamente lo mismo exacto para el segundo número. Acabo de imprimir entrar el segundo número. Y luego vamos a tener otro entero, int número dos es igual a punto de entrada siguiente int. En lo que va al primer paso se hace. Ahora tenemos los dos números. Ahora deberíamos conseguir una operación matemática. Entonces más menos estrella o cuatro barra será suma, resta, multiplicación, o división. A continuación, vamos a decirle al usuario qué hacer. Puedo decir entrar a una operación. Entonces vamos a decir qué opciones hay. Además, menos estrella y slash. Como digo, String Operation es igual a punto de entrada siguiente. Por lo que ahora tenemos acceso tanto a los números como a la operación que queremos. Ahora usar sentencias if para comparar dos cadenas no funciona correctamente con todo lo que te he enseñado hasta ahora. Con eso dicho, vamos a estar usando declaraciones switch aquí. Puedo decir operación del interruptor. Entonces podría decir caso con un plus. Voy a sumar en break y luego voy a decir caso menos break. Sólo voy a seguir adelante y sumar en los cuatro de estos. Tenemos caso, estrella, break, case, forward slash break. Ahora para obtener un resultado en todos estos, necesito crearlo fuera de este corsé rizado. Los detalles de por qué eso se explicarán en un futuro video. Entonces voy a crear un entero llamado resultados. Todavía no voy a asignar un valor. Vamos a hacer eso dentro de nuestra declaración switch. Entonces si entraron un plus, entonces voy a decir que los resultados son iguales al número uno más el número dos. También asegúrate de deletrear un número de correctamente. Entonces desde menos, voy a decir que el resultado es igual número uno menos el número dos. Para la multiplicación, puedo decir que el resultado es igual número uno por el número dos. Y luego por división puedo decir resultado es igual número uno dividido por el número dos. Ahora, fuera de la declaración switch, entonces puedo imprimir el resultado, como digo, espacio de resultados. Y puedo sumar los resultados aquí mismo. Ahora aquí realmente estamos recibiendo un error y nuestro IDE al pasar el cursor sobre esto, dice que los resultados variables podrían no haber sido inicializados. Podemos seguir adelante y dar click en inicializar una variable. Simplemente va a asignar 0 aquí mismo. A pesar de que vamos a anular ese valor, todavía le gusta ver que vamos a tener un valor predeterminado porque no sabe con certeza si se ejecutará uno de estos cuatro casos. Vamos a seguir adelante y correr esto y vamos a ver qué pasa. Si presiono Shift y F2, va a decir ingresar el primer número. Voy a ingresar cinco, ingresar el segundo número, tres, y la operación de giro. Voy a entrar en la multiplicación. El resultado es de 15, y ahora mira hacia atrás al primer número. Entonces, por ejemplo, podría hacer 105 y luego resta. Y aquí tenemos cinco. Por lo que va a seguir haciendo bucle una y otra vez y seguir pidiendo el primer segundo número. Y entonces podemos hacer cualquier tipo de operacionalmente que queramos con esos números. Ahora ten en cuenta que estamos usando enteros aquí. Entonces si intentas ver solo te va a dar toda una serie de resultados. Si querías unos resultados más precisos, puedes usar double y en lugar de entero para la variable de resultado. Ahora si puedes ponerlo este programa por tu cuenta, entonces felicitaciones y buen trabajo. Pero si necesitaba ver algo del video extra para hacerlo, no te preocupes, eso está perfectamente bien, sobre todo si eres nuevo en la programación, porque esta es una habilidad completamente nueva. medida que avanza por el curso, más cosas se vuelven más evidentes para ti y más fáciles para ti. Solo lleva tiempo aprender todas estas cosas. 17. Métodos: Aquí es donde las cosas comienzan a complicarse un poco más pero también más divertidas. Este siguiente tema es acerca de los métodos. Los métodos son básicamente solo un bloque de código que se ejecutan y su objetivo es hacer una cosa específica. De hecho, hemos estado trabajando todo el tiempo en un metodista. Este método principal aquí se ejecuta de forma predeterminada cada vez que ejecutamos nuestro propio programa. Pero podemos crear nuestros propios métodos fuera de los tirantes rizados para la función principal, puedo decir público, estático, vacío, ejemplo, paréntesis, y luego llaves rizadas. Y aquí podemos escribir el código que quieras. Por ejemplo, simplemente puedo imprimir hola mundo. Entonces en nuestro método principal, puedo decir ejemplo. Y automáticamente sabrá que estamos tratando de ejecutar esta función. Si presiono Shift y F2, debería ejecutar nuestro programa. Y aquí vemos HelloWorld en la consola. Por lo que aquí está pasando muchas cosas. Y también he mencionado métodos, y también he mencionado funciones. Y las funciones son prácticamente lo mismo, aunque hay una ligera diferencia. La función es básicamente lo que vemos aquí mismo. Esta es técnicamente una función y así es esta. Pero siempre que una función esté dentro de una clase, lo cual explicaré en un futuro video. Estos ahora se llaman métodos, pero en la mayoría de los casos no importará. Son intercambiables en su mayor parte. Pero técnicamente una función está fuera de una clase y un método está dentro. Ahora de nuevo, cubriremos las clases con más detalle en el futuro por ahora, solo piense en ellas como un contenedor en donde todos sus métodos podrán sentarse. Agregar estos paréntesis aquí invocará o ejecutará o activará esta función. Todos estos son términos intercambiables básicamente de una forma de ejecutar la función. Esas también son terminologías comunes que se usan cuando en realidad estamos tratando de ejecutar una función. Ahora tal vez te estés preguntando por qué llamamos el método de ejemplo cuando solo podemos imprimir Hello World en el método principal. Bueno, eso es porque obviamente este es un ejemplo sobresimplificado. En un programa real, es posible que no desee simplemente usar esta función de ejemplo una vez. Es posible que desee usar esta función de ejemplo varias veces a lo largo de su clase o haber estado a lo largo de todo su proyecto. Tener la capacidad abstraer ciertas piezas de funcionalidad en sus propios métodos hace que sea mucho más fácil reutilizar esa funcionalidad. Esto lo veremos en ejemplos reales medida que avanzamos hacia el curso. Pero ahora vamos a explicar cuáles son estos paréntesis y también lo que este vacío significa aquí mismo. Básicamente una función puede recibir entrada y también puede devolver entrada. Voy a deshacerme de estos comentarios. Y si hago clic en el nombre del ejemplo y presiono Shift y F6, ahora puedo refactorizar o cambiar el nombre de toda esta función. Puedo decir agregar. Ahora si presiono Enter, cambia el nombre la función así como la invocación de la función. Ahora dentro de los paréntesis, podemos sumar en algo conocido como parámetros. Por ejemplo, puedo decir int num uno y int num2. Estos están separados por una coma. Incluso podemos tener múltiples tipos de variables. Por ejemplo, ejemplo de cadena. Pero en este caso solo estamos agregando dos números. Entonces no hay necesidad de tener una cuerda aquí. Ahora, automáticamente inteligente nos da esta flecha roja aquí, diciendo que no podemos llamarla sin ningún parámetro. Entonces podemos pasar alguna información aquí, por ejemplo, 510, y ahora ya no tenemos ningún error, pero este código no funciona como esperamos. Eso es porque todavía estamos simplemente imprimiendo Hello World. Pero lo que queríamos hacer es que queremos devolver la suma entre num1 y num2. Puedo decir volver num1 más num2. Ahora nos da error aquí. Si pongo el cursor sobre él, dice que no puede devolver un valor de un método con un tipo de resultado vacío. Esto evita aquí mismo, significa que no se va a devolver nada. Tenemos que ser muy claros qué tipo de datos se devolverán de cada función. En este caso, estamos devolviendo un entero porque estamos agregando para introducir juntos. Entonces podríamos cambiar un vacío a int y el error desaparece. Ahora por aquí puedo decir int sum es igual a agregar 510, y puedo imprimir algunos. Ahora si ejecuto esto con Shift F ten, esto imprimirá 15 a la consola. Ahora si quisiéramos, también podríamos simplemente pasar en esta llamada de función dentro de la función de línea de impresión. Y de hecho, la línea de impresión ha sido su propia función incorporada que hemos estado utilizando todo este tiempo. Tiene paréntesis propios y le estamos pasando información al mismo como lo estamos con esta función add. Y aquí hay un ejemplo perfecto de por qué queremos hacer funciones. Porque puedo copiar y pegar esto un par de veces. Y ahora puedo sumar en diferentes valores de lo que quería. Esto ahora nos da tres resultados diferentes de 1520 y tres negativos. Y es todo porque tenemos una sencilla función de agregar justo aquí. Ahora obviamente esta es una función muy simple. Pero si teníamos funciones más complicadas con más código dentro de ellas, pueden ver los beneficios de tener que solo escribir el código una vez y luego una ejecución que desde diferentes lugares como muchas veces como lo quieras. Ahora una última nota es que estos aquí son técnicamente llamados parámetros, pero cuando se pasan , como aquí mismo, o estos números directamente, estos son conocidos como argumentos. Tiene parámetros y argumentos. Al igual que funciones o métodos, estos se usan a menudo indistintamente, pero técnicamente, lo que escribes en la propia función se conoce como parámetros. Y lo que se pasa a la función se conoce como argumentos. Pero de nuevo, al igual que las funciones versus métodos, a menudo se usan indistintamente. 18. Sobrecarga de métodos: En el video anterior, creamos una sencilla función add que devuelve la suma entre dos números. Pero, ¿y si queremos sumar cadenas juntas para crear una frase? Por ejemplo, puedo imprimir add hello and world. Y obviamente esto no funciona. Pero por supuesto podría imprimir sumar 55 y esto funcionaría. Ahora, típicamente, solo se puede tener un método con el mismo nombre, similar a las variables, pero podemos hacer algo conocido como sobrecarga de métodos. Esto significa básicamente tener múltiples métodos con el mismo nombre, pero diferentes parámetros y diferentes tipos de retorno. Por ejemplo, puedo decir cadena estática pública con una S mayúscula, String s1 y S2. Ahora dentro de aquí puedo devolver s1 más un espacio más S2. Básicamente juntando las dos palabras. Ahora tenemos dos métodos que tienen el mismo nombre, pero los hemos sobrecargado donde Java ahora va a saber cuál llamar dependiendo de los parámetros pasados. En línea, cinco están pasando y cuerdas. Entonces, ¿cómo va a llamar un método aquí? Las líneas se pegan para pasar un entero. Entonces, ¿cómo va a llamar al método aquí? Puedo seguir adelante y ejecutar esta funda la salida. Aquí vemos HelloWorld y diez. sobrecarga de métodos suele ser útil en situaciones como esta, donde tienes funcionalidades similares, pero quieres pasar en diferentes tipos de variables. Puedes sobrecargar esos métodos, básicamente conándolos y teniendo diferentes parámetros y posiblemente un tipo de retorno diferente si tiene sentido para ti. 19. Alcance: Cada vez que creamos un corsé rizado de apertura, como éste de aquí mismo, está creando algo conocido como un alcance. Y el alcance va a limitar lo que puede y no puede usar ciertas variables. Por ejemplo, puedo decir int contador es igual a 0. Y luego voy a crear un bucle while para incrementar este contador. Mientras que el contador es menos de diez. Entonces puedo decir contador más plus. Ahora podemos acceder como contador perfectamente bien, así que puedo imprimirlo aquí mismo y todo funciona como se esperaba. Pero, ¿qué pasa si creo una segunda variable en el interior? Por ejemplo, digo int ejemplo es igual a 15. Y yo iba a imprimir esto por cualquier razón. Obviamente no tiene mucho sentido, pero esto es solo un ejemplo. Todo funciona hasta ahora. Pero, ¿qué sucede si intento acceder al ejemplo fuera del alcance del bucle while? Para que pudiera intentar imprimirlo. Puedo añadir un ejemplo y aquí obtenemos un error. Si pongo el cursor sobre esto, dice que no puede resolver el ejemplo del símbolo e incluso tiene una solución aquí. O puedo hacer clic para llevar el ejemplo int al ámbito actual. Tenga en cuenta que el ejemplo se crea en línea 14 aquí mismo. Pero si voy a hacer click sobre la solución, ahora estamos creando la variable en la línea nueve, que está dentro del ámbito de la función principal. Esto significa que todo dentro la función principal puede usarlo, incluido el alcance propio de los bucles while, porque también estoy dentro de la función principal. Por lo que ha cambiado nuestro código para simplemente reasignar ejemplo con el valor de 15. Pero lo estamos creando fuera del bucle while. Ahora, incluso con todo esto dicho, no es una buena idea simplemente poner ciegamente todas tus variables en la parte superior de tu función. Por ejemplo, digamos que no estoy imprimiendo esta variable aquí en la línea 20. En este caso, la variable de ejemplo no tiene por qué definirse en el ámbito principal. Y en cambio, podría simplemente definirse en el alcance del bucle while. Podría decir int ejemplo. Y entonces puedo deshacerme de la creación de variables aquí mismo. Típicamente, a menos que tenga una buena razón para, siempre debe definir sus variables lo más localmente posible. Por eso, quiero decir, aquí mismo, esto es localmente lo posible porque estamos utilizando la variable en línea 16. Por lo que se va a su local al alcance aquí mismo. No hay necesidad de definirlo fuera en el ámbito principal, porque ahora mismo con este código, no estamos usando un anti, el alcance principal en absoluto. Sólo lo estamos usando dentro del alcance del bucle while. 20. Operador ternario: A veces es posible que desee escribir una sentencia if, pero de una manera más condensada, este suele ser el caso siempre que desee tener un solo valor o que esté asignando a una variable dependiendo de un afirmación verdadera o falsa, podemos lograr que esto era algo conocido como operador ternario. Esto básicamente va a ser algún tipo de condición seguido de un signo de interrogación, luego un valor verdadero, dos dos, y luego un valor falso. Ahora esto podría parecer confuso. Entonces echemos un vistazo a un ejemplo real. Voy a crear un booleano llamado es miembro hasta que esto sea igual a verdadero. Esto podría ser si estás pagando por una membresía en algún lugar y ofrecen un solo pago único, podrían darte un descuento en esa compra. Entonces por ejemplo, aquí puedo decir int precio igual es miembro. Ahora de nuevo, esta es nuestra condición. Una condición es sólo una expresión booleana. Por lo que una simple declaración booleana funcionará bien. Entonces signo de interrogación, y luego tenemos nuestro verdadero valor. En este caso el precio podría ser de $10. Pero lo que dice que queremos cobrar un precio más alto a las personas que no son ya miembros. Por lo que puedo añadir cualquier colon y luego el precio aquí podría estar en $40. Ahora puedo seguir adelante e imprimir el precio aquí. Y puedo correr esto con turno y FTN. Aquí vemos diez en la consola. Pero si cambio es miembro a false y ejecuto esto, entonces vamos a ver 40 en la consola. El motivo de esto es ahora esta condición aquí es falsa. Entonces, ¿qué va a usar este código aquí que fue en parte falso valor, cualquier cosa después de los dos dos se va a utilizar. Si la condición es falsa, cualquier cosa antes del colon se va a usar si es cierto. Ahora obviamente podríamos hacer algo parecido a esto. Si digo int precio es igual a 0, entonces puedo decir si es, recuerda, ahora puedo decir precio es igual a diez, lo contrario precio es igual a 40. Y esto funcionará exactamente de la misma manera. Pero un operador ternario realmente brilla aquí cada vez que estás usando declaraciones si muy simples donde quieres que esto esté en una sola línea de código. Porque obviamente escribir esta línea de código es mucho más fácil que escribir todos estos. 21. Matrices: Hablemos ahora de matrices, que son básicamente sólo una colección de variables. A modo de ejemplo, digamos que tengo una serie de puntuaciones diferentes en las pruebas estudiantiles. Puedo decir int estudiante uno es igual a 96, int estudiante dos es igual a 49, estudiante tres es igual a 76, y así sucesivamente y así sucesivamente. A menos que tenga un montón de estos, bueno, no quiero necesariamente crear un montón de variables diferentes. En cambio, puedo crear una variable que se conoce como una matriz. Esto básicamente va a ser una colección o una lista de un montón de variables diferentes. Primero tengo que especificar de variable que la matriz va a contener. Cada matriz solo puede contener uno, un solo tipo. No puedes mezclarlos y emparejarlos. Por ejemplo, no se puede tener un entero con una cadena que todos tengan que ser del mismo tipo exacto. Por lo que puedo decir int, abriendo y cerrando corchetes. Esto representa una matriz. No podía decir que las puntuaciones de los estudiantes equivalen a un nuevo ancho int, los corchetes también. Esto va a crear nuestra propia matriz. Pero cada vez que estamos creando array sin valores iniciales, que te mostraré un ejemplo de aquí en un momento, sí tenemos que especificar cuántos tipos diferentes de elementos queremos hacer espacio para. En este caso, quería hacer espacio para tres. Y así ahora he creado en matriz que puede contener hasta los tres enteros para asignar un valor específico. Puedo decir puntuaciones de estudiantes, corchetes. Y aquí es donde especificamos algo conocido como índice. Esto es básicamente solo un contador para cual ranura exacta vamos a usar de los tres que se nos dan. Esto comienza a contar a las 0. Por lo que puedo decir que los estudiantes puntajes índice de 0 equivale a 96. Estudiantes puntuaciones índice de uno es igual a 49. Alumnos puntuaciones índice de dos iguales a 76. Ahora voy a seguir adelante y deshacerme de estos tres enteros aquí arriba. Y ahora quiero imprimir cada uno de estos a la consola. Entonces para hacer eso, podemos usar una sintaxis muy similar a esta. Por lo que puedo imprimir puntuaciones de estudiantes índice de 0. Voy a seguir adelante y copiar y pegar esto usando Control C y Control V, o Comando C, comando V en un Mac. Y ahora puedo cambiar estos índices a 12. Ahora puedo ejecutar esto con turno y FTN. Aquí vemos los tres números. Pero qué pasa si intento acceder al índice tres, que en realidad no existe. De hecho, tenemos esta pequeña advertencia aquí mismo. Si pongo el cursor sobre esto, dice que índice de matriz está fuera de equilibrio. Si voy a ejecutar esto, en realidad vamos a obtener un error en nuestra consola. Y esto se conoce como una excepción. Una excepción es algo que echará un vistazo más a fondo en el futuro. Pero por ahora, solo piénsalo como un error. El motivo por el que conseguimos esto es porque estamos tratando de acceder a algo para lo que la matriz no tiene espacio para. Solo asignamos espacio para tres enteros en esta matriz, y hemos utilizado los tres. Nuevamente, recuerda, comienza a contar a las 0. Entonces los tres spots tenemos nuestro 012. Por lo tanto, el índice tres no puede existir. Y dice tratar de acceder a algo fuera de los límites de esta matriz. Un ejemplo más que quiero mostrarte es cómo crear un entero estableciendo valores específicos al crearlo. Entonces en lugar de especificar tres, podemos eliminar esto. Y luego después de los corchetes, vamos a crear nuestros propios tirantes rizados. Aquí adentro. Podemos sumar en cualquier número de elementos. Queremos Ejemplo noventa y seis, cuarenta y nueve y setenta y seis. Y ahora tenemos estas advertencias aquí. Si pongo el cursor sobre él, dice que ya está asignada una variable a este valor. Por lo que esencialmente estas tres líneas de código aquí no son necesariamente en absoluto. Al eliminarlos y vuelvo a ejecutar el programa, vamos a obtener la misma salida exacta que ves aquí mismo. Ahora podemos tener matrices para cualquier tipo de variables. Por ejemplo, podemos crear una matriz de cadenas o una matriz de booleanos, pero este es un ejemplo muy simple con enteros. Y una última cosa que quería mostrarte es cómo acceder a la longitud o al número de elementos dentro de una matriz. Y una última cosa que quería mostrarte es cómo acceder a cuántos elementos son, ¿cuántos elementos hay dentro de una matriz? Puedo imprimir esto. Voy a acceder a los estudiantes puntajes punto aquí. Podemos acceder longitud. Esto va a ser un entero, y va a decir cuántos elementos hay dentro de esta matriz. Para que pueda seguir adelante y correr esto. Aquí vemos el número tres porque hay tres elementos. Si añadí uno extra aquí, entonces puedo correr esta una vez más y deberíamos ver cuatro como lo hacemos aquí mismo. Ahora claro que no vemos los 100 impresos a la consola porque no estamos imprimiendo el índice tres, que ahora existe gracias a este 100 aquí mismo. Pero sólo estamos imprimiendo los ceros iniciales o al 100 está en exhibición a la consola. 22. Para cada bucle: En el video anterior, echamos un vistazo a cómo crear matrices y también cómo acceder a cada elemento individual. Pero y si tuviéramos un mayor número de enteros y no queremos imprimir principalmente cada uno. Podemos usar un bucle estándar o algo conocido como un para cada bucle para seguir adelante y recorrer cada elemento. Aquí, te mostraré dos ejemplos. Aquí tenemos un estándar for-loop. También te mostraré un nuevo concepto que es un para cada bucle. Pero primero tenemos un estándar for-loop, como digo, para paréntesis, llaves rizadas. Y dentro primero voy a crear mi propio entero int contador es igual a 0. Si bien el contador es menor que los estudiantes anotan longitud de punto. Podemos entonces aumentar contador. Y luego aquí sin duda puedo imprimir estudiantes puntajes índice de contador. Podemos pasar en variables como un índice aquí. Y esto accederá al índice 0, luego 12, y así sucesivamente hasta que pasemos por cada elemento de esta matriz. Para probar esto, puedo ejecutar esto con turno y F11. Aquí vemos los cuatro números en nuestra consola. Ahora bucle a través de matrices es tan común que hicieron una sintaxis más corta. Voy a comentar estas tres líneas. Aquí. Voy a usar algo conocido como un bucle para cada uno. Puedo decir por número int, colon, luego el nombre de nuestra matriz. En este caso un estudiante anota. Dentro de aquí el número de variable va a contener cada elemento individual a medida que los bucles a través de ellos. Entonces la primera iteración de este bucle, la variable numérica contendrá el valor 96. La próxima vez que atraviese, sostendrá 49 y así sucesivamente. Para probar esto, puedo imprimir número y puedo ejecutar esto con turno y FTN. Y aquí vemos la misma salida exacta. Ahora, normalmente un bucle foreach funcionará, pero en algunos casos de uso es posible que necesite acceso al índice que está utilizando. Por ejemplo, esta variable de contador justo aquí. En estas situaciones, simplemente puedes usar un estándar for-loop. Pero de nuevo, en la mayoría de las situaciones el para cada bucle estará bien. 23. Matrices multidimensionales: En videos anteriores hemos echado un vistazo a matrices simples, pero ahora echemos un vistazo a matrices multidimensionales. Básicamente un Raisa tiene matrices como valores. Aquí voy a crear una matriz que tenga una matriz de puntuaciones. Por ejemplo, puedo decir int dos corchetes aquí, puntuaciones es igual a llaves rizadas. Y dentro de aquí se va a esperar otra matriz de valores. Pero para definir estas matrices, solo vamos a estar usando los tirantes rizados. Por ejemplo, tenemos nuestros tirantes rizados con noventa, seis, cuarenta, cinco y ochenta. Ahora para que esto sea más fácil de entender enumerado ahora, para que esto sea más fácil entender lo que va a ser esto para Test1. Entonces tenemos test2, que tiene diferentes puntuaciones, digamos 8666 y luego 90. ¿ Cómo queremos recorrer cada elemento individual? Primero tenemos que recorrer cada matriz individual, donde el valor luego se convierte en cada matriz individual aquí. Por lo que podemos usar un for-loop estándar así como un para cada bucle. Te mostraré un ejemplo de ambos. Para el for-loop estándar, supongo que para int contador es igual a 0, mientras que el contador es menor que las puntuaciones longitud de punto, entonces puedo aumentar contador. Ahora dentro de aquí, necesitamos algo conocido como un anidado for-loop. ¿ Dónde está, donde tenemos un bucle dentro de un bucle? Puedo decir por int contador a igual a 0, mientras que el contador dos es menor que las puntuaciones, índice de contador de la longitud del punto más más contador a lo que está sucediendo aquí. Básicamente, estamos haciendo un estándar for-loop, que estoy seguro que ya entiendes. Pero entonces tenemos un anidado for-loop. Estoy creando una segunda variable de contador y estoy usando en todas partes aparte de aquí mismo. Básicamente lo que va a pasar es que estamos haciendo un bucle a través de cada matriz individual. Y a esto es a lo que vamos a tener acceso en el primer for-loop. índice 0 del primer for-loop será todo este índice de matriz uno, o la segunda iteración a medida que atraviesa de nuevo, será toda esta matriz. Pero ahora vamos a acceder a cada elemento individual dentro puntajes índice de contador al principio va a acceder a esta matriz aquí mismo. Estamos accediendo a la propiedad length desde la primera matriz. Y luego como el bucle inicial for-loop de nuevo, vamos a obtener acceso a la segunda matriz porque contador con uno igual. Nuevamente, recuerda que este es el índice 0. Índice uno. Los índices comienzan a contar al 0. Entonces para acceder a cada valor individual puedo imprimir. Primero, voy a imprimir test plus, agregaré entre paréntesis y puedo decir contador más uno. El motivo de esto es porque el contador comienza en 0 y queremos decir test1, test2 y no probar 0, probar uno. Simplemente vamos a añadir uno al mostrador. Pero esto no ha ido a modificar la contra-variable en absoluto porque esencialmente estamos tomando el valor de contador y luego agregando una. Pero no estamos asignando eso a la contrarvariable. Después, vamos a sumar en cada partitura individual. Por ejemplo, puntuaciones índice de contador, y luego un segundo corchete, índice de contador para parar. Corro esto con turno y F2. Ahora vemos test1 es 9825 y la prueba dos es ochenta y seis, sesenta y seis y noventa. Sólo para simplificar un poco las cosas, si me deshago de estos paréntesis y ejecuto esto, básicamente obtenemos lo mismo exacto excepto este contador aquí va a mostrar el índice 0 ya que estamos haciendo un bucle la primera matriz, e index1 ya que estamos haciendo un bucle a través de la segunda matriz. El único motivo por el que agregué más uno aquí es para que sea más legible para el ser humano. Ahora, como se puede decir, este código es un poco confuso. Y típicamente no vas a trabajar con matrices multidimensionales que a menudo, Idealmente existen mejores soluciones para manejar tus datos, especialmente si tus datos necesitan tres o más dimensiones de matrices, por lo general siempre va a haber una mejor solución que usar esas muchas matrices anidadas. Pero solo para estar completo aquí, voy a seguir adelante y mostrarte cómo bucle a través una matriz anidada o una matriz multidimensional más bien, con un, para cada bucle, digo para int array, puedo llamar a esta matriz puntajes de un colon. Esto va a recorrer cada matriz individual. Ahora dentro de aquí tenemos acceso a cada array. Entonces para la primera iteración de eso, para cada bucle, vamos a tener acceso a este valor. Y luego la siguiente iteración vamos a tener acceso a este valor. Podemos usar un estándar para cada bucle en esta matriz. Para el número, matriz de dos puntos uno. Ahora dentro de aquí podemos imprimir número. Ahora puedo ejecutar esto con turno y F2. Y aquí vemos los seis números individuales. Este es un buen ejemplo, como mencioné en el último video, que para cada loops no tienen acceso al índice. Aquí estamos diciendo ese número de prueba porque esencialmente estamos usando el índice aquí mismo. Ambos por cada bucles. No necesariamente tenemos acceso a eso. Si quisieras acceder al índice para imprimir el número de prueba, y entonces tendrías que usar un estándar for-loop. 24. Varargs: Ahora que tenemos una mejor comprensión de las matrices, podemos abordar un concepto conocido como varargs, que es una forma diferente de pasar en tantos parámetros diferentes como quieras a una función. Entonces voy a hacer una función de add muy simple. Puedo decir público, static int add. Y aquí puedo tener int num1, int num2 dentro de aquí. Es muy sencillo. Simplemente regresamos num1 más num2. Ahora para asegurarme de que todo funcione, puedo imprimir sumar pases en 1015, y puedo ejecutar esto con turno y F11. Aquí vemos la suma como 25, por lo que todo parece estar funcionando. Pero y si quiero añadir en otro número aquí, o varios números diferentes tantos como quiera. El problema aquí es que ahora tengo que agregar en un parámetro individual para cada entrada y una serie de entradas posiblemente podría cambiar. Bueno, el concepto de varargs resuelve esto. Esencialmente podemos pasar en cualquier número de enteros a nuestros parámetros. Por ejemplo, puedo decir int tres puntos y luego ninfas o números, cualquiera que prefieras. Los números esencialmente va a ser una matriz. Con eso dicho, ya no tenemos acceso a num1, num2. En cambio, ahora necesitamos recorrer cada elemento individual de esta matriz, como digo, int sum es igual a 0. Y luego puedo devolver algunos. Pero antes de regresar, tenemos que sumar en realidad cada número a la suma. Puedo usar un for-loop estándar o puede usar un para cada bucle. Entonces para el número int, números de colon. Y entonces puedo decir suma es más igual a número. Por lo que ahora puedo ejecutar esto y deberíamos ver la suma de todos estos números aquí mismo, que a los 53. Podemos incluso bajar esto a tantos o tan pocos argumentos como queramos. Por ejemplo, sólo puedo tomar estaño y va a imprimir diez. Ahora una cosa a tener en cuenta es que los varargs necesitan ser el último argumento. Porque si teníamos cosas adicionales aquí, por cualquier razón nosotros, digamos que tenemos aquí un número entero estudiantil. No sabe dónde empieza y dónde se detienen. Si tenemos argumentos adicionales que necesitaremos agregarlos ante los varargs. Varargs siempre debe estar al final. Entonces sabe por dónde empiezan, y sabe que cada parámetro adicional pasado, se va a acceder como ese varargs. Por ejemplo, diez aquí van a ser estudiantes, y en realidad lo identifica aquí mismo, pero cualquier número adicional aquí. Por lo que solo 515 ahora van a ser parte del parámetro varargs. 25. Constantes y fundido: A veces es posible que no desee que sus variables cambien los valores, y también a veces podría querer cambiar el tipo de variables que son sus variables. Empecemos echando un vistazo a algo conocido como constantes. Y esto básicamente significa que un valor variable no puede cambiar. Si digo que el nombre de cadena es igual a Alex, puedo imprimir esto a la consola. Y por supuesto antes de hacerlo, en realidad puedo cambiar esto a mi nombre completo, que es Alexander. Pero digamos hipotéticamente, no quiero que este valor cambie. Puedo añadir la palabra clave final antes de crear nuestra variable. Y ahora me sale un error aquí mismo. Si pongo el cursor sobre esto, va a decir que no se puede asignar un valor a una variable final. Nombre podría estar preguntándose, ¿por qué querrías hacer esto? ¿ Por qué no simplemente no cambiar el valor de la variable? Esa podría ser la solución obvia cuando se trata de programas simples como éste. Pero en unos programas reales donde se tienen cientos de archivos en cientos de miles de líneas de código potencialmente, y potencialmente incluso otros compañeros de trabajo. Es posible que no recuerdes todo lo que hace tu código. Y también es posible que no recuerde que ciertas variables podrían tener efectos secundarios si cambia los valores. Si vas a tener una variable cuyos valores no deben cambiar, entonces deberías convertirla en una variable final con esta palabra clave aquí. Ahora a continuación, te voy a mostrar algo conocido como casting, que es básicamente donde puedes tomar una variable y asignarla a una variable diferente de un tipo diferente. Por ejemplo, podría decir int cantidad es igual a diez. Y luego puedo crear un doble que tenga un valor decimal. Por lo tanto, podemos tener números no enteros. Y puedo decir que nueva cantidad equivale a cantidad. Ahora si voy adelante e imprimo nueva cantidad y ejecuto esto con turno y FTN. Ahora vemos diez puntos 0. Y en este caso en realidad no necesitamos lanzar nada porque todos los dobles técnicamente pueden seguir siendo enteros. Pero una vez que creamos un doble, se va a sumar en el decimal de 0, pero supongamos que esto se iba a revertir. Puedo decir doble cantidad es igual a 10.5. Entonces podría decir int nueva cantidad equivale a cantidad. Y nos da un error aquí. Si pongo el cursor sobre esto, dice que el tipo requerido es un entero, pero proporcionado tipo como un doble. Bueno, podemos hacer algo conocido como casting este entero excepto el valor doble como un valor entero. Y para ello, podemos agregar paréntesis y el tipo de variable, en este caso int justo antes del nombre de la variable objetivo, que en este caso es monto. Ahora si ejecuto esto, ahora decimos diez en la consola y no 10.5, porque los enteros solo pueden ser números enteros. Entonces todo lo que no sea aceptable, por ejemplo, este 0.5 sólo va a ser ignorado. El número entero que queda en este caso, estaño va a ser asignado a nuestra nueva variable de cantidad aquí mismo. Ahora así es como se lanzan valores primitivos. Y voy a discutir la diferencia entre los tipos de valores primitivos y de referencia en un futuro video. Tomemos un ejemplo rápido de cómo convertir un entero en una cadena. Entonces, por ejemplo, tenemos un número entero diez, pero queremos la cadena diez, algo como esto. Bueno, puedo decir int número es igual a diez. Entonces puedo decir cadena, cadena es igual a cadena con un valor mayúscula de punto S de. Aquí podemos ver todos los diferentes parámetros posibles que podemos pasar. Podemos pasar en un entero, un char a lo largo a flote y tantos otros. En este caso, sólo queremos pasar en un número. Y luego puedo imprimir cadena a la consola. Y si ejecuto esto, vamos a ver diez como una cuerda. Ahora si quería hacer el revés aquí, puedo decir cadena, cadena es igual a diez entre comillas. Entonces podría decir número int. Entonces podría decir entero con un capital I dot parse int. Y aquí vemos podemos pasar en una cuerda. Y esta función superior también va a devolver un entero. Puedo pasar en los argumentos de la cadena. Entonces puedo imprimir el número a la consola. Si dirijo esto, todavía deberíamos ver diez. Pero ahora esto es un valor numérico real. Por lo que quería, podría aumentar esto en uno antes de imprimirlo. Ahora con C11, de antemano, estábamos convirtiendo un número a una cadena, por lo que no pudimos aumentar que una vez ya estaba en forma de cadena. 26. Métodos comunes de cuerdas: En este punto, ya debes saber cómo funciona un básico si Stephen funciona. Pero si alguna vez intentaste comparar cadenas con una declaración if, podrías notar que no funciona correctamente. Por ejemplo, comencemos pidiéndole al usuario alguna entrada. Podría decir que introduzca su nombre. Después voy a crear un escáner. Llamaré a esta entrada. Voy a hacer esto igual a un nuevo escáner que pasa en el sistema dot n Todo esto es algo bastante similar a lo que hemos visto antes. Podría decir stream, nombre de usuario es igual a punto de entrada siguiente línea. Esto recuperará toda la línea que el usuario ha ingresado. Ahora digamos que si entro mi nombre como Alex, entonces dirá hola Alex. Por supuesto, en un programa real, sólo podríamos usar el valor variable. Pero quiero hacerlo específicamente en una declaración if para demostrar algo. Puedo decir si el nombre de usuario es exactamente igual a Alex, no pude imprimir Hola Alex. Puedo correr esto con Shift y lo dejé. Entonces podría ingresar mi nombre y voy a ingresar la cadena exacta que estamos buscando en la declaración if. Entonces Alex, con una mayúscula a, si voy adelante y entro a eso y luego presiono Enter, no vemos nada impreso a la consola. Eso se debe a que las fortalezas no se pueden comparar mediante el uso de un signo doble igual. Si pasa el cursor sobre esto, dice que los valores de cadena se comparan usando dobles iguales y no iguales como método. Con el fin de comparar cadenas. En lugar de usar masa igual, podemos tomar la cuerda, podemos presionar dot. Y aquí tenemos acceso a un montón de funciones diferentes. Vamos a ver un par de estos hacia el final de este video. Pero el que quiero mostrarte se llama igual así como igual igual a ignorar caso. Entonces vamos a empezar con iguales. Aquí podemos pasar en otra cadena, por ejemplo, Alex y yo podemos ejecutar esto. Y ahora puedo entrar a Alex con una mayúscula a. Y entonces dirá Hola Alex. Si vuelvo a correr esto, puedo entrar a Alex con una minúscula a. Y nada que imprimimos. Si quisiera ignorar la capitalización de cualquiera de las cuerdas, entonces puedo decir iguales ignorar caso y luego pasar a Alex. Entonces si ejecuto esto, ahora puedo entrar a Alex con una minúscula Y va a imprimir Hola Alex, porque no va a importarle la capitalización de cualquiera de las cuerdas. Así es como comparamos dos cadenas dentro de una declaración if. Pero ahora echemos un vistazo a un par de otros ejemplos de métodos de cadena de uso común. Voy a seguir adelante y eliminar todo este código. Y simplemente voy a decir que el nombre de cadena es igual a Alex. Y luego dentro de aquí no voy a imprimir tema, adoptar a minúsculas. No podía correr esto y vamos a ver a Alex que tiene una mayúscula Ahora los mostramos todas minúsculas en la consola. De manera similar, también tenemos que mayúsculas. Y por supuesto si ejecuto esto, vemos a Alex en todas mayúsculas y la consola. Hay un par de otras funciones que tenemos , como la longitud. Si ejecuto esto, vamos a ver cuántos caracteres individuales hay dentro de la cadena. En este caso es para. Y en realidad podemos simplemente presionar un periodo al final del nombre y vemos un montón de otros métodos que podemos usar. Por ejemplo, aquí podemos conseguir un personaje en un índice específico. Aquí puedo obtener el índice uno, que debería ser una minúscula l Si ejecuto esto, podemos confirmarlo en nuestra consola. Aquí vemos una minúscula volví. Tenemos un montón de otras opciones. Por ejemplo, podemos concat, lo que significa concatenar, básicamente agregando en una parte extra de una cadena. Para que pueda agregar aquí todo mi apellido. Y si corro esto, ahora vemos a Alex Flores. Y el espacio que ha agregado en la consola es por el espacio que agregué aquí mismo. Por defecto, no agregará ningún espacio. Sólo hará exactamente lo que se le diga. Siéntase libre de meterse con algunas otras funciones de cadena aquí, hay una serie de útiles que realmente puede usar para cambiar la cadena o para usar la cadena de diferentes maneras. 27. Secuencias de escape: Ahora vamos a sumergirnos en otro concepto de cuerdas conocido como secuencias de escape. Esto básicamente va a ser personajes individuales que tienen significados específicos dentro de las moderaciones. Por ejemplo, puedo decir string, string equivale a hello space, world. Voy a seguir adelante e imprimir esto en la consola. Y por supuesto esto acabaría de imprimir hola mundo. Pero, ¿y si quisiera hola y mundo para estar en diferentes líneas? Bueno, puedo usar una slash hacia adelante n Ahora esto se convierte en un color naranja. Eso es porque esto ha conocido como una secuencia de escape para slash n va a ser una nueva línea. Para probar esto, puedo ejecutarlo turno veloz y FTN. Aquí vemos Hello World en la siguiente línea. Otra es la slash hacia adelante n, que va a ser una pestaña. Por ejemplo, después de agregar una nueva línea, ahora puedo agregar en una nueva pestaña. Y puedo volver a ejecutar esto. Aquí vemos Hello world, pero el mundo ahora está sangrado una vez por un personaje de pestaña. También podemos hacer dos slashes hacia adelante, que sólo se convierte en una sola slash hacia adelante. Debido a horas sumamos en una sola slash hacia adelante. Se va a suponer que esto iba a ser un personaje de escape o una secuencia de escape. Pero si quería una slash real hacia adelante y la cadena, no tuve que escapar de esa slash hacia adelante básicamente simplemente agregando 200 palabras office. Entonces puedo ejecutar esto. Aquí. Ahora vemos una slash hacia adelante en la cadena. tanto que de antemano va a suponer que vamos a tratar de escapar con una W mayúscula, lo que en realidad no significa nada. Por lo que ahora nos va a dar un error. También podemos escapar de comillas dobles. Por lo que esto sólo se convertirá en una cita doble normal. Y la razón de esto es porque una doble comillas representa el inicio o el final de una cadena. Si simplemente tuviera que añadir aquí una cita doble, no va a saber que esto tiene que ser parte de la cadena. Más bien un piensa que estamos tratando en la cadena actual como variable. Si me fui mundo para estar entre cotizaciones, puedo añadir en las comillas dobles, pero tengo que escapar de ellas agregando una previsión de antemano. Ahora esto se ve un poco confuso. Por lo que voy a reemplazar todas las secuencias de escape anteriores solo un espacio simple. Así que ahora puedo ejecutar esto y deberíamos ver Hello World, pero el mundo está envuelto dentro de comillas dobles. Ahora hay una serie de otros caracteres de secuencia de escape que puedes usar, pero estos son con mucho los más comunes. Vas a ver. 28. La clase de matemáticas y números aleatorios: Echemos un vistazo a la clase de matemáticas. Y esto tiene un par de cosas diferentes que podemos hacer cuando se trata de operaciones matemáticas básicas. El primer ejemplo va a ser obtener el valor absoluto de un número, que básicamente sólo va a convertir un número negativo a un número positivo. Pero más técnicamente, esto va a contar la distancia de ese número a 0. Voy a imprimir matemáticas con un capitalino M dot abs, que representa valor absoluto. Y aquí podemos ver que podemos pasar en una serie de diferentes valores numéricos. En este caso, podemos pasar en diez positivos. Fui a copiar y pegar esto y pasar en diez negativos. Y entonces puedo ejecutar esto con turno y FTN. Y aquí vemos estaño en ambos casos. Entonces en términos básicos, esto sólo convertirá un número negativo a un número positivo. Voy a seguir adelante y comentar esto. Avanzando, puedo imprimir punto matemático mínimo. Y esto va a tomar en dos números del mismo tipo, y esto devolverá el valor mínimo entre ellos. Por ejemplo, puedo pasar en 107, también voy a imprimir math.max, que es un concepto similar, pero devolveremos el valor máximo entre ellos. También puedo devolver 107 aquí también. Entonces si ejecuto esto la primera vez, vamos a conseguir siete porque ese es el valor mínimo. Pero la segunda vez vamos a conseguir diez porque ese es el valor máximo. Ahora si decimos punto matemático y pasaríamos por todos estos, hay una serie de operaciones matemáticas diferentes. Por lo que podría estar familiarizado con dependiendo experiencia que tenga con las matemáticas en la escuela. Pero algunos ejemplos más básicos serán piso, que básicamente solo redondeará el número hacia abajo. Y también sello, que correrá un número hacia arriba. Por ejemplo, puedo pasar en 0.2. Puedo envolver esto dentro de imprimir esto por aquí. Entonces también puedo imprimir matemática.Piso y puedo pasar en 0.9. Ahora si ejecuto esto dentro de nuestra consola, vamos a ver uno y también 0. Esto va a redondear, pase lo que pase, no importa si es inferior a cinco. Y va a redondear, pase lo que pase, no importa si es mayor o igual a cinco. Ahora una cosa más que quería mostrarte es cómo generar un número aleatorio. Hay dos formas de hacerlo. Hay una forma más antigua en la que lo más probable es que la vea detrás un tiempo dentro de trabajar con otro código están siguiendo otros tutoriales. Y hay una forma más nueva. El camino más antiguo, puedo decir int aleatorio es igual a nuevo al azar con un capital R paréntesis aquí en la prensa Alt y Enter para importar esto, entonces podría decir NExtint. Entonces puedo imprimir al azar en la consola. Entonces si ejecuto esto, vamos a conseguir un número aleatorio. Obviamente esto va a generar cualquier número aleatorio, pero no necesariamente queremos eso. Muchas veces queremos algo entre 010 son apenas 0100, cosas así. Para que podamos pasar en un entero aquí. Por ejemplo, diez, ejecútanos. Ahora va a generar un número aleatorio entre 09. Pero si queríamos uno a diez, simplemente podemos añadir uno al final de esto. Entonces si vuelvo a correr esto, aquí vemos dos. No sé si sigo corriendo esto, vamos a conseguir tu número aleatorio entre 110. Esta es la antigua forma de hacer esto. Hay una nueva forma. Así que el número aleatorio sabía, podría decir int aleatorio igual a hilo, punto aleatorio local, punto actual siguiente int. Y esto funciona de la misma manera exacta que antes. Y también con tanto la vieja como la nueva forma de hacerlo este fin de semana generar otros valores aleatorios, por ejemplo, los booleanos. Si queríamos un valor verdadero o falso aleatorio, que surgirá de vez en cuando. Puedes usar next Boolean. Puedes conseguir ram a continuación, dobles y otras cosas por el estilo. Pero por ejemplo, aquí podemos pasar un int y luego el límite será de diez, y vamos a añadir uno al final de la misma. Y luego puedo imprimir al azar a la consola. Entonces estas son las dos formas diferentes de generar números aleatorios dentro de tu programa Java. 29. Variables primitivas vs. tipográficas de referencia: Este video va a ser un poco más avanzado que los videos anteriores. Vamos a aprender sobre variables primitivas versus de tipo de referencia y cómo se almacenan ciertas variables en la memoria. Entonces voy a minimizar mi proyecto aquí mismo. Por lo que tenemos más espacio para estos diagramas. Aquí tenemos la pila y aquí tenemos el montón. Se trata de dos lugares diferentes donde la información se puede almacenar en la memoria de su computadora. Empezaremos hablando de valores de tipo primitivos. Por ejemplo, podría decir int número es igual a diez. Esto se conoce como un tipo primitivo evalue típicamente almacenar piezas básicas de información. Todos los valores de tipo primitivo se almacenan directamente en la pila, y esto va de abajo hacia arriba. Otros ejemplos serían booleanos. Puedo decir que la programación es igual a verdad? Entonces puedo tener carta char igual a a. puedo tener un doble, puedo llamar a esto pi. Y así que igual a 3.14159. Y estos son los principales valores de tipo primitivo que vas a ver. Déjame volver. Déjame borrar un par de estos y volvamos a nuestro número. Pero qué pasa si tuviera que asignar un número a igual al valor del número uno. Por ejemplo, el número dos es igual a número más audaz en realidad todavía creará un valor completamente nuevo en la pila. Ahora el número dos es igual al valor del número. Qué pasaría si modificara el valor del número uno que afecta al número dos, voy a imprimir número. Y luego en la siguiente línea voy a imprimir el número dos. Antes de esto, voy a decir número es igual a 15. Lo que va a pasar aquí es porque estos son dos valores separados. número dos no va a verse afectado en absoluto. Por lo que esto imprimirá 15 y luego diez. Para probar esto, puedo ejecutarlo con Shift y FTN. Aquí vemos 1510. Entonces los tipos primitivos tendrán su propio valor individual en la pila, incluso si lo estamos asignando a una variable existente. Esto simplemente creará otra variable en memoria de su computadora y le asignará ese valor. Esto significa que la línea ocho va a crear un entero separado que no tiene ninguna correlación con esa línea número siete, aparte del hecho de que pasan a compartir el mismo valor. Eso es bonito, pero ¿qué es un tipo de referencia? Y mientras que el montón utilizado. Así que voy a dejar todo este código aquí y voy a crear una matriz entera. Puedo decir números int es igual a 51015. Y esto va a crear algo tanto en la pila como en el montón. Pero los valores 51015 se almacenan en el montón. Y los números variables se van a almacenar en la pila. Pero esto sólo va a estar almacenando algo conocido como puntero. No los detalles exactos de cómo funcionan los punteros detrás de escena no son demasiado importantes cuando se trabaja con Java, porque Java maneja mucho de esto para nosotros. Pero esto básicamente sólo, apunta al valor real que ha almacenado en el montón. Por ejemplo, puedo crear otra matriz aquí. Puedo llamar a este ejemplo. Puedo establecer esto igual a números. Lo que sucede aquí es nuestros valores de matriz 51015. Sigue existiendo sólo una vez en la memoria de nuestra computadora. Y esos tres valores se almacenan en el montón como una matriz. Pero las variables, números y ejemplo se almacenan en la pila, pero ahora son punteros apuntando a la matriz de enteros. Eso significa que si modificamos 510 o 15, en realidad veremos ese cambio sin importar a qué variable estemos intentando acceder, ya sean números o ejemplo. Para probar esto, puedo decir números, índice uno, que va a ser el diez aquí, es igual a 11. Entonces puedo imprimir números index1. Y luego puedo imprimir ejemplo índice uno. Puedo ejecutar esto con turno y FTN. Aquí vemos 11 en ambos casos. Eso es porque estos tres valores aquí se almacenan en el montón solo una vez. Y luego la matriz de números y el ejemplo de Ray solo van a apuntar a ese valor. significa que tenemos dos variables separadas que vemos aquí al ejecutar tu código, pero los valores solo se almacenan una vez dentro del montón. Y esta es una diferencia entre los tipos primitivos y de referencia. Los tipos de referencia van a tener sus valores solo una vez en el montón con un puntero en la pila. Pero los tipos primitivos son tan simples que podemos simplemente almacenar los valores en la pila. Entonces puedo decir int num1 es igual a cinco, int num2 es igual a diez. Y luego voy a llamar a una función add, que hará aquí en un segundo, y voy a pasar en 510. Saliendo fuera de nuestra función principal, puedo decir public, static int add, int num1, int num2. Dentro de aquí puedo devolver num1 más num2. Lo que va a pasar aquí es cuando pasemos en 510, realidad va a crear dos variables más en la pila llamada num1 y num2 asignar los mismos valores exactos que los argumentos que estamos pasando aquí mismo. Para probar esto, después de nuestra función add, voy a imprimir num uno con una coma y luego num2. Pero dentro de nuestra función add, voy a decir num1 es igual a diez. Ahora si ejecuto esto, ahora vemos 510. Pero en realidad cambiamos num uno igual a diez. Y de hecho la suma de la función add. Si tuviera que poner esto dentro de una declaración impresa, esto va a imprimir 20. Entonces si corro este tiempo más cálido con el 20 en la consola y luego 510, solo desglose esta línea por línea por acaso es un confuso para ti. Primero se crearon dos variables que se almacenan en la pila, 510. Estamos pensando fuimos a imprimir la suma, pasando en 510. Observe cómo no estamos cambiando num1, num2 en ningún momento. Eso es importante notar cuando llegamos a la línea diez, cuando pasábamos en num1 y num2 a la consola. Estas dos variables no están cambiando en absoluto. Una vez que en realidad invocamos la función add, estamos pasando en 510, que van a crear dos variables más almacenadas en una pila. Y sucede que sólo modificamos el primer número o el primer argumento aquí mismo, al valor de diez. Esencialmente significa que estamos agregando diez a cualquiera que sea el segundo argumento, que en este caso son diez, y por eso tenemos 20 aquí mismo. Ahora la parte importante aquí es que estamos modificando el primer argumento que se pasa, pero esto tiene un entero completamente nuevo. Los tipos primitivos sólo van a pasar en su valor. Y básicamente va a ser sólo una copia de ese valor. Cualquier modificación a eso dentro de la función no lo afectará en realidad en la función que originalmente la llamó. Básicamente estamos modificando nuestro primer argumento aquí. Pero en realidad no es modificar nada desde nuestra función principal. Eso se debe a que estos son tipos primitivos y solo se pasa el valor. Pero, ¿qué pasa si pasamos en una matriz de enteros? Por ejemplo, tenemos una matriz con solo dos valores. En lugar de num1 y num2, puedo decir números int es igual a 510. Entonces podría pasar en números. Y luego voy a registrar números índice 0 y números índice uno. Ahora tenemos un problema con nuestra función ya que ella cortes estaban esperando dos enteros diferentes. Pero en cambio, solo quiero agregar dos números juntos de una matriz de números, como digo int, corchetes, números. Entonces puedo devolver números, índice 0 más números y X1. ******* ejecutar esto con turno y F11. Aquí deberíamos ver tanto los algunos impresos cada número individual como vemos aquí mismo. Pero qué pasaría si cambio números índice 0 a diez, que originalmente es cinco en esta matriz, ten en cuenta que esta matriz no se está cambiando en absoluto. Y estamos pasando el primer elemento de la matriz a este registro de consola justo aquí. Entonces si ejecuto esto, ahora decimos 20 impresos como suma Kf están cambiando el primer índice que tiene índice 0, que es cinco, al valor de bronceado aquí mismo. Lo que significa que básicamente estamos imprimiendo diez más diez. Pero entonces el índice de números 0 impreso a la consola ahora se cambia. Eso se debe a que la referencia o el puntero a esa matriz se pasa como argumento, no los valores reales mismos. Entonces cuando vamos a Modificar números índice 0, en realidad está modificando la misma matriz exacta que creamos en línea cinco, porque solo estamos pasando ese puntero que está en una pila que apenas apunta a los valores reales que se almacenan en el montón. Y esta es una diferencia importante entre tipos primitivos y de referencia cada vez que se trabaja con funciones, es importante saber que cuando se modifica algo como argumento, por ejemplo, int números aquí mismo, que podría o no realmente modificar eso con el resto de su programa dependiendo de si es un tipo primitivo o de referencia. Ahora muchos de estos conceptos son nuevos y sé que este es probablemente uno de los conceptos más confusos a la hora de programar. Si eres nuevo en la programación. Entonces, si estás teniendo algún problema, sugiero ver esta lección otra vez y realmente tratar de enfocarte en la pila y el montón en representaciones visuales como una explicación todo. 30. Conceptos básicos de programación orientada a objetos: Ahora nos vamos a sumergir en un concepto conocido como programación orientada a objetos. Y una forma corta de decir esto es aro u OOP. Y aquí es definitivamente donde Java se pone mucho más interesante y en realidad podemos construir algunos programas del mundo real con él. Pero primero, vamos a hablar de lo que es la programación orientada a objetos? Bueno, este es un concepto que no es exclusivo de Java. Otros lenguajes de programación tienen esta constante también. Aquí es básicamente donde podemos representar objetos del mundo real dentro de nuestro código. Y en estos próximos videos, voy a estar explicando qué significan otras palabras clave, como class y static, y otras palabras clave que mencioné voy a explicar más adelante. Echemos un vistazo rápidamente a lo que es una clase frente a un objeto. Clase básicamente va a ser el código real que representa el blueprint de un cierto tipo de funcionalidad o de cierto tipo de objeto. Ahora cuando digo plano, quiero que pienses en un plano de Casas. Por ejemplo, si alguna vez ves un montón de casas que se parecen entre sí, solo hay una, un solo plano que básicamente copian y pegaron. Y cada casa va a ser su propio objeto. Una casa va a ser un objeto o el plano va a ser la clase. Por lo que podemos tener un mini instancias de cada clase individual y esas son conocidas como objetos. Lo que en realidad se utiliza este ejemplo de casa en un ejemplo de programación real dentro de nuestro paquete principal aquí, puedo hacer clic derecho. Puedo ir a New, y luego a la clase Java dentro de aquí. Voy a nombrar esta casa, pero voy a estar usando una notación de caso Pascal, básicamente lo que significa que capitalizamos la primera letra de cada palabra. Si tuviera ejemplo de casa, tanto la H como la E serían capitalizados. Pero en este caso sólo quiero clase de crédito llamada casa. Adelante y presiona Enter y debe abrirse automáticamente. Y ahora dentro de esta clase o dentro de este blueprint, podemos sumar en diversas propiedades. Ahora, ¿qué es una propiedad? Estas son básicamente variables y métodos que se definen específicamente dentro de esta clase de casa. Y nos ayuda a acceder a diferentes valores o trabajar con diferentes funcionalidades dentro del contexto de una casa. Buceando en mucho más detalle de lo que realmente entraría en una clase de casa en los próximos videos. Pero primero, echemos un vistazo rápido a cómo esta clase de casa en realidad se puede usar dentro de nuestra clase principal aquí. Voy a seguir adelante y borrar algunos de estos comentarios. Ahora puedo decir casa con un H. mayúscula Y aquí vemos que va a tratar importar desde nuestro sistema de archivos local. Puedo seguir adelante y presionar Enter, y luego aquí podemos seguir adelante y nombrar nuestra variable. En este caso, diré casa con una h minúscula, voy a asignarnos igual a una casa nueva. Ahora la nueva palabra clave forma parte de la programación orientada a objetos y clases, pero los detalles de eso se explicarán más adelante. Por ahora, podemos pensar en esto como básicamente solo tener una casa nueva, una clase de casa aquí mismo. Este va a ser el plano, pero ahora realmente hemos creado una instancia real de nuestra casa. Tomemos un ejemplo muy sencillo al tener la casa print helloworld. Puedo decir vacío público. Y observa cómo no tenemos estática aquí. Explicaré la diferencia entre métodos estáticos y no estáticos en unos pocos videos. Pero por ahora, no incluyan estática en este ejemplo. Tan público, vacío, impreso. Y entonces no voy a tener parámetros. Simplemente voy a imprimir hola mundo a la consola. Ahora si pongo el cursor sobre esto, vemos que el método imprime nunca se usa. Vamos a seguir adelante y tratar de usarlo. Volviendo a nuestra clase principal aquí tenemos acceso a esta casa. Puedo decir House prensa un periodo. Esto va a tener un desplegable con todas las propiedades y métodos disponibles a los que podamos acceder. En este caso, tenemos acceso a nuestra función de impresión. Puedo seguir adelante y presionar Enter, y voy a ejecutar esto. Y aquí vemos Hello World en la consola. Voy a seguir adelante y cambiar el nombre de esta variable. Puedo hacer clic en cualquier parte dentro del nombre de la variable, y puedo mantener pulsada Mayús y presionar F6 al mismo tiempo. Ahora podemos seguir adelante y cambiar esto. Voy a cambiar este nombre a mi casa con una H mayúscula y m minúscula ahora, voy a crear una variable completamente nueva. Como digo, house. Tu casa es igual a una casa nueva. Y estas dos variables no tienen nada en común aparte del hecho de que fueron creadas con la misma clase. Básicamente son vecinos el uno del otro, pero no son la misma casa. Si tu vecino tiene una casa similar a la tuya, no significa que sea tu casa. Si sólo una casa similar basada en el mismo plano. Por ejemplo, puedo decir que su casa dot print. Y puedo seguir adelante y correr esto. Y ahora vamos a ver dos instancias de HelloWorld y nuestra consola, como vemos aquí mismo. Esto es lo básico de las clases y cómo crear objetos alrededor de esas clases. Y en los próximos videos, vamos a estar sumergiéndonos mucho más en la programación orientada a objetos, donde podemos crear un objeto de casa funcional que realmente representa un real casa dentro de nuestros programas. 31. Constructores: Ahora vamos a hablar un concepto llamado constructores, que básicamente sólo va a ser un método incorporado en cada clase que se ejecute o invoque cada vez que se encuentre una nueva instancia de esa clase creado. En realidad hay un constructor predeterminado en cada clase. Ya sea que creemos uno nosotros mismos o no, va a tener uno automáticamente. Entonces un constructor, vamos a ver algo así como un método, pero ligeramente diferente porque no iba a tener un tipo de retorno, como el vacío aquí mismo. Y también el nombre del constructor tiene que ser el nombre exacto de la clase. Por lo que puedo decir casa pública con una capital H. Esto ahora se conoce como nuestro constructor. Para probar esto, voy a imprimir una nueva casa se hizo. Y voy a ejecutar esto en nuestra consola. Aquí vemos una casa nueva se hizo porque creamos una nueva instancia de nuestra clase de casa justo aquí como la variable mi casa. Y así eso hizo que el constructor se corriera dentro de nuestra impresión a cabo hola mundo. Pero entonces estamos creando otra casa, lo que significa que el otro constructor es rampa. Y luego por supuesto que estamos imprimiendo hola mundo otra vez. Ahora un constructor no puede devolver nada, pero no puede tomar diferentes parámetros. Por ejemplo, puedo tener el nombre del propietario de cadena. Entonces puedo decir que se hizo una casa nueva. El propietario es como un agregado en el nombre del propietario. Ahora nos dan dos problemas relacionados aquí mismo. Eso es porque de vuelta en nuestra clase principal, no estamos pasando en ningún argumento. Entonces por ejemplo aquí puede pasar un Alex. Por supuesto que puedes añadir a tu propio nombre. Y aquí voy a pasar en Bob. Por supuesto que puedes añadir en cualquier otro nombre que quieras. Entonces si ejecuto esto, ahora podemos echar un vistazo a nuestra consola. Y aquí vemos que se hizo una casa nueva. El dueño es Alex. Y eso es porque creamos una nueva instancia de una clase de casa aquí mismo. Y pasamos un ALEKS como cadena a nuestro constructor. Y luego por supuesto, cuando creamos la casa de Bob, vemos que el dueño es Bob y la consola. Ahora, similar a los métodos, los constructores pueden ser anulados, por lo que podemos pasar en diferentes tipos de valores a los parámetros. Como digo, casa pública. No podía decir pisos. Aquí, pude imprimir casa nueva se hizo. Tiene puedo sumar en pisos y eso se puede sumar en los pisos de cuerda. Y también voy a poner paréntesis alrededor de la S porque podríamos pasar en una casa de un solo piso. Por lo que ahora tenemos dos constructores diferentes, y estos se van a correr en diferentes momentos. Por ejemplo, refuerzos de la casa de Bob. En lugar de pasar por Bob, voy a hacer de esta una casa de dos pisos. Podrías notar que automáticamente IntelliJ SE va a notar que este ahora va a ser el parámetro floors. Esto no va a ser dueño llamado como dice aquí mismo. Eso es porque entiende que estamos anulando al constructor para pasar dos tipos diferentes de variables. Y aquí estamos pasando un entero. Entonces eso significa que vamos a estar usando este constructor aquí mismo. Así que ahora si ejecuto esto y si miramos a nuestra consola, ahora vemos que la primera instancia de nuestra casa va a imprimirse. El dueño es Alex. Pero la segunda instancia de nuestra casa va a imprimir a tiene dos pisos. Eso es porque estamos utilizando el diferente tipo de constructor que solo pasa en enteros. Ahora en este ejemplo, acabamos de imprimir algún texto, pero en casos de uso reales, que vamos a echar un vistazo en unos pocos videos. Básicamente vamos a utilizar estos como funciones de puesta a punto para asegurarnos de que todo lo demás esté configurado y vaya a funcionar correctamente para que nuestra casa funcione. 32. La palabra clave y las propiedades "este": Ahora vamos a mirar la, esta palabra clave, así como cómo crear diferentes propiedades que básicamente van a ser solo variables dentro de nuestra clase. Voy a deshacerme de estos comentarios aquí. Y también voy a deshacerme de estas declaraciones impresas dentro de nuestros dos constructores. Ahora dentro de nuestra clase, pero fuera de las funciones, voy a crear un par de variables diferentes. Por ejemplo, podría decir cadena privada con una S mayúscula, nombre de propietario. No podía decir pisos int privados. Y la parte privada de esto, así como el público sobre algunos de estos métodos se va a explicar en un futuro video. Ahora ya he demostrado cómo podemos sobrecargar constructores. Pero en este caso, solo queremos un solo constructor con ambas piezas de información que se transmitan. Aquí puedo decir int pisos. Y ahora dentro de esto, voy a querer asignar el nuevo nombre de propietario y los nuevos pisos desde los parámetros a nuestras variables locales. Debido a que estas dos variables aquí son variables diferentes entonces nuestros parámetros aquí mismo. Pero antes de hacer eso, tenemos dos problemas relacionados porque si vuelvo, ahora estamos usando sintaxis incorrecta para un constructor. Aquí, digamos que mi casa tiene dos historias, a menos que diga que esta sigue siendo la casa de Bob, que por supuesto puedes usar cualquier cuerda que quieras en estos, pero también son dos historias. Entonces volviendo a la clase de casa, ya no tenemos ningún problema. Pero cómo vamos a establecer el nombre del propietario en línea para igual al parámetro que se está pasando. Porque por supuesto, son del mismo nombre exacto. Decir que el nombre del propietario equivale al nombre del propietario realmente no hace nada. En realidad no modifica línea para nada, porque esto va a hacer referencia a la variable más local en el ámbito, que en este caso sólo va a ser el parámetro bajo nombre aquí mismo. Ahora técnicamente, podríamos cambiar los nombres de estas variables, por lo que no son exactamente los mismos, pero esa no es la solución más correcta. La solución más correcta solo diría que este nombre de propietario de punto es igual a nombre del propietario y este piso de puntos es igual a fuerza. ¿ Qué está pasando aquí en realidad? Bueno, esto representa el objeto actual. Siempre que se corriera este constructor para mi casa, que tiene el nombre propietario de Alex y dos pisos. El, esta palabra clave aquí mismo va a hacer referencia al objeto de mi casa aquí mismo. Cuando estamos creando la casa de Bob, que este objeto de aquí mismo va a estar haciendo referencia al objeto de tu casa aquí mismo. El, esta palabra clave aquí mismo va a representar el objeto actual que se está utilizando para esta clase. Para probar esto dentro de nuestra función de impresión, puedo decir que esta casa es propiedad de. Entonces podría imprimir este nombre de propietario de puntos. Y tiene además esta fuerza de pisos de punto. Por supuesto, pondré paréntesis alrededor de la S si quieres pasar en una casa de un solo piso. Ahora todavía estamos usando esta función de impresión, como se puede ver aquí mismo. Voy a seguir adelante y ejecutar este programa. Y aquí vemos en esta casa es propiedad de Alex y tiene dos plantas. También vemos que esta casa era propiedad de Bob y tiene dos plantas. Los nombres y el número de pisos se van a guardar localmente. Aquí mismo. No estamos accediendo a los parámetros que agregamos aquí mismo, porque estos son rebotados a los que solo se accede dentro del alcance del constructor. Entonces básicamente tenemos nuestros propios parámetros o nuestras propias variables dentro de esta clase. Estamos asignando esos cada vez que estamos creando el objeto desde el constructor. Y luego podemos acceder a estas variables en cualquier parte dentro de esta clase. Por ejemplo, dentro de esta función de impresión diciendo este nombre de propietario de punto y que las guerras de cosas. Ahora, técnicamente en este caso de uso para la función de impresión, la, this palabra clave es opcional porque por defecto asumirá que vamos a utilizar la instancia actual de la clase. Para que pueda seguir adelante y eliminarlos. Y si vuelvo a correr esto, va a funcionar de la misma manera exacta. Ahora, técnicamente esta no es una buena práctica porque decir this.name y pisos de escritorio deja muy claro que estamos tratando de acceder a variables almacenadas en la clase, pero técnicamente es opcional en este caso de la función printf. Pero nuestro constructor tiene que ser requerido porque tienen los mismos nombres de variables exactos que nuestro parámetro. Para ser muy claros, qué valores estamos asignando, qué variables. Podemos decir este punto en su nombre para hacer referencia aquí a nuestra cadena privada local. Y este dot floors AQUI hace referencia nuestro entero privado local aquí. Y luego asignarlos al nombre del propietario en perímetro. Y el parámetro pisos. 33. Encapsulación, abstracción, Getters y configuradores: Buceando aún más en la programación orientada a objetos, ahora vamos a introducir dos conceptos más que van a ser un poco más confusos, pero ojalá pueda explicarlos lo suficientemente bien como para que usted pueda plenamente entender. Estos dos conceptos van a ser conocidos como encapsulación así como obstracción. Pero también estamos echando un vistazo a getters y setters, que son una especie de ejemplo de abstracción. encapsulación básicamente va a ser un concepto de programación orientada a objetos donde queremos que toda nuestra funcionalidad quede encapsulada en un solo lugar. E incluso una clase en sí misma es una especie de ejemplo de encapsulación. Por ejemplo, aquí tenemos una clase de casa. Entonces cualquier funcionalidad que vamos a tener respecto a una casa, a tener respecto a una casa, como cuántas puertas tiene, cuántos pisos tiene, diferentes ventanas y habitaciones y otras cosas por el estilo. Básicamente, cualquier cosa que ver con una casa debe estar encerrada o encapsulada dentro de esta clase de casa. Ahora otro concepto es algo así como algún medicamento o una píldora donde tienes toda la funcionalidad encapsulada dentro de una sola píldora. Eso significa que los usuarios de esta clase o las personas que toman la medicina, no necesariamente tienen que conocer el funcionamiento interno, todo. Simplemente tienen que ver el objeto exterior y saber que todo está encapsulado por dentro. Eso es más un concepto que realmente no se puede demostrar con claridad, pero es algo que es importante entender que al escribir tu propio código Java, quieres que todo sea capsulado dentro de su propia clase. Ahora el siguiente concepto es la abstracción, que es ligeramente similar a la encapsulación. Pero básicamente esto significa que solo quieres que el usuario que está usando la clase obtenga acceso a cosas que realmente necesitan. Por ejemplo, voy a cambiar estas propiedades privadas aquí mismo a públicas. Y te explicaré qué privado versus público en este video. Pero por ahora, solo sigue adelante y cambia estos a público. Y ahora dentro de nuestro archivo principal, después de crear la primera casa, pero antes de imprimirla, puedo decir mi casa dot. Ahora aquí tenemos acceso a todas las propiedades y métodos dentro de esta clase. Y podemos ver el nombre del propietario y los pisos. Puedo cambiar el nombre del propietario a Bob. Digamos que Bob acaba de secuestrar mi casa, por ejemplo. Y si corro esto, ahora vemos a Bob dos veces en el causal, como vemos aquí mismo. Ahora esta es técnicamente una mala práctica. Y voy a cambiar estas variables a privadas usando Control Z o Comando Z en un Mac. Y ahora vemos un problema relacionado. Si pongo el cursor sobre esto de aquí mismo, dice que el nombre del propietario tiene un acceso privado dentro de com dot desgastado llaves dot house. Entonces voy a eliminar esta línea de código aquí mismo. Y ahora no podemos acceder directamente a quien posee la casa sin estar en realidad dentro de la casa. Por ejemplo, podría decir que este nombre de punto es igual a Bob, y esto funcionaría bien. Y eso es porque la propiedad privada de aquí es algo conocido como modificador de acceso. Esto va a restringir el acceso que tienen ciertas cosas cuando se trata de diferentes propiedades y métodos. Un método privado o propiedad privada en este caso, va a significar que lo único que puede acceder a esto son cosas dentro de la misma clase exacta. Por eso podemos acceder a ella aquí mismo , así como aquí mismo. A pesar de que es privado, todavía estamos dentro de la clase. Por eso también tuvimos el error aquí mismo. Lo que estoy tratando de acceder a ella porque no estamos dentro de la clase de casa. Estamos dentro de la clase de curso Warnock keys o cualquiera que llamara su clase. Ahora, público, como probablemente puedas adivinar, significa que cualquier cosa puede acceder a él accediendo a su propio objeto. Por ejemplo, tenemos una impresión de vacío público. Este método es público, lo que significa que si tenemos un objeto para esta clase, por ejemplo, mi casa o tu casa, entonces podremos acceder al método de impresión en ella. Ahora tal vez te estés preguntando por qué no solo acceder directamente a lo que queramos. ¿ Por qué restringir cierto acceso? Bueno, ese es todo el concepto detrás de la abstracción básicamente va a tomar toda la funcionalidad interior y cómo funciona la casa y solo te dará acceso a lo necesario para que la Casa pueda realizar su trabajo. Ahora en algunas situaciones, se puede dar acceso interno a ciertas cosas usando getters y setters, que vamos a echar un vistazo aquí en un momento. Pero típicamente como una buena regla general, solo debes dar acceso a lo que es absolutamente necesario. Y nunca debes dar acceso directo a variables directamente como esta. En cambio, siempre debes usar getters y setters. Echemos un vistazo rápido a cómo funciona eso. Puedo decir público, string get. Ahora aquí va a auto pueblan el concepto de get owner name, que en realidad es lo que voy a utilizar aquí. El motivo por el que supe esto es porque va a devolver una cuerda. Y cada vez que escribo Git, va a suponer que están creando algo conocido como método getter. Básicamente, este es solo un método que devuelve una propiedad privada. En este caso, puedo devolver el nombre del propietario. Ahora realmente puedo acceder al nombre del propietario que es privado de este método getter. También tenemos métodos setter, que es un concepto similar, pero obviamente no estamos obteniendo el valor. En cambio estamos estudiando el valor, como digo, vacío público porque no estamos devolviendo nada. Establecer el nombre del propietario dentro de aquí. Va a tener un parámetro. Puedo decir nombre del propietario de cadena. Y luego dentro de esto puedo decir que este nombre del propietario del punto es igual a nombre del propietario. Ahora si quisiera, en realidad puedo ir a mi casa, como digo, mi casa dot set nombre dueño. Puedo pasar en Joe. Y si ejecuto esto, entonces vamos a ver a Joe y Bob en la consola. Y en realidad vemos a Bob dos veces por error que cometí aquí en la función de impresión. A modo de ejemplo, dije que podemos usar esto aquí. Voy a seguir adelante y eliminar esto y luego ejecutar el programa una vez más. Y ahora vemos a Joe y Bob en la consola. Este es un ejemplo de un método getter y un método setter. Ahora tal vez te estés preguntando por qué molestarte con cualquiera de estos getters y setters. ¿ Por qué no eliminar por completo estas funciones aquí y simplemente hacer públicas nuestras propiedades? Cuando estaba aprendiendo por primera vez programación orientada a objetos, tendría la misma pregunta exacta y estaba muy confundido. ¿ Por qué hacer todo este trabajo extra y solo por los mismos resultados exactos. Pero como escribí más y más código a lo largo de los años, me di cuenta de que usar getters y setters es mucho más conveniente y hace las cosas mucho más organizadas. Por ejemplo, imagina que tenemos un proyecto muy grande con decenas de casas. Oliver, nuestro proyecto, y queremos cambiar todos los nombres de los propietarios a, digamos mayúsculas. O queremos registrar todos los nombres de los propietarios cada vez que se cambien o algo por el estilo. Quiero realizar algún tipo de funcionalidad cada vez que el nombre del propietario haya cambiado. Por ejemplo, aquí podemos decir que este nombre propietario es igual a nombre del propietario dot ToupperCase. Y para hacer las cosas aún más convenientes, podemos cambiar una línea diez aquí mismo de este nombre propietario es igual a nombre para establecer el nombre del propietario. Pasando a nombre del propietario. Esto lo hará al constructor predeterminado también tendrá que ser una mayúscula. Si ejecuto esto, deberíamos ver tanto en nuestros nombres como en mayúsculas. Y si tuviéramos todo puesto a público sin ningún getters o setters, y teníamos docenas de casas en un proyecto más grande, tendríamos que pasar y cambiar manualmente todos nuestros nombres a mayúsculas, que suena muy tedioso y muy molesto. Pero porque usamos las reglas correctas de abstracción y usamos getters y setters con propiedades privadas justo aquí arriba. Ahora tenemos la capacidad de cambiar fácilmente ciertos aspectos de nuestro programa de un solo cambio aquí mismo. 34. Herencia: Echemos un vistazo a algo conocido como herencia. Aquí es básicamente donde podemos agregar o extender otra clase para darle más funcionalidad. Por ejemplo, puedo hacer una nueva clase Java y voy a llamar a este hotel. Y voy a extender casa. Como digo extiende casa. Lo que esto significa es que va a heredar toda la funcionalidad dentro de la clase de casa. Pero entonces podemos sumar más funcionalidad y lado. Por ejemplo, ahora podemos especificar un metraje cuadrado de cabildero, o el número de personal, cosas así, que el hotel tiene una casa no tiene, pero una casa todavía va a tener dueño y un cierto número de pisos que también cuenta con un hotel. En lugar de hacer una clase de hotel, que tendría estas propiedades dentro, solo vamos a extender casa que ya tiene estas propiedades. De esa manera no tenemos que hacerlos de nuevo. Pero estamos recibiendo este error aquí. Si pongo el cursor sobre él, dice que no hay ningún constructor predeterminado disponible. Si vamos a la casa, vemos que no hay constructor predeterminado, lo que significa que no había constructor que tuviera 0 parámetros. Por lo que tenemos estos dos parámetros aquí mismo, el nombre del propietario y los pisos. Y eso significa que nuestro hotel, que extiende casa, también tiene que tener un constructor similar. Por lo que puedo decir público, hotel, cadena, nombre del propietario, y luego int pisos. Ahora obtenemos otro error. Si pongo el cursor sobre esto, dice que no hay ningún constructor predeterminado disponible. Esto significa que tenemos que usar algo conocido como el super método. Entonces si llamo superhéroes, entonces podría pasar en nombre de propietario y pisos. Y la super función sólo se va a utilizar dentro de las clases que extienden otra clase. Esto básicamente llamará al constructor de la clase que estamos extendiendo en este caso casa. Por lo que ahora hemos creado un constructor hotelero. Esto va a llamar a un constructor del constructor de la casa. Por ello, vamos a establecer las propiedades privadas de nombre propietario y pisos iguales a las propiedades que estamos pasando. En este caso, simplemente vamos a pasar esos y desde el constructor del hotel. Ahora bien, si esto parece confuso, no te preocupes, sigamos adelante y hagamos una nueva instancia hotelera, y tendrá mucho más sentido después de eso. Aquí en nuestra clase principal, voy a decir hotel. Mi hotel es igual a un hotel nuevo. Entonces podemos pasar en el dueño. Y luego la cantidad de pisos, digamos diez. Ahora puedo imprimir mi punto del hotel consigue el nombre del propietario. Pero dentro de la clase hotelera, no tenemos un nombre de propietario en absoluto. Eso es porque seguimos ampliando la clase de casa, hereda toda la funcionalidad anterior dentro de esta clase. Por ejemplo, obtener el nombre del propietario. Así que por supuesto si fuera a ejecutar esto, simplemente imprimirá a Alex en la consola. No voy a aburrirte con ese concepto simple. Estoy seguro de que lo entiendes. Pero vamos a sumergirnos más en cómo funcionan estos constructores y cómo funciona el súper método. Básicamente, estoy pasando ALEKS y estaño como parámetros al constructor hotelero. Por lo tanto, el nombre propietario y los pisos serán Alex y diez fueron entonces llamando super, que va a llamar al constructor de la clase extendida. En este caso, eso es casa. Esencialmente vamos a llamar a esta función aquí mismo, que los establecerá propiedades privadas iguales a Alex y diez. Ahora podemos acceder a estos dentro del hotel si son públicos o algo que se conoce como protegido. Entonces, hasta ahora hemos visto privado y público. También hubo otro que está protegido. Por ejemplo, dentro del constructor. No puedo imprimir este nombre de propietario. Vemos en el desplegable aquí, no hay opción. Y además si solo lo dejo así, vamos a conseguir un error. Si pongo el cursor sobre esto, dice que nombre del propietario tiene acceso privado. Eso es porque el acceso privado significa que las únicas cosas directamente en esta clase pueden acceder a él. No necesariamente cosas que extienden esta clase. Si queríamos que las clases extensivas accedieran a ella, podemos cambiar de privado para protegerlo. Ahora el error desaparece y protegerlo básicamente significa que cualquier cosa dentro de la clase puede usarlo así como cualquier clase que extienda esta clase puede usarlo. 35. Polimorfismo: Hablemos ahora de un concepto conocido como polimorfismo. Esto es básicamente algo que significa muchas formas porque el poli significa muchas y el morfismo significa formas. Para echar un vistazo al problema que resuelve el polimorfismo. Aquí tenemos el objeto mi hotel así como el objeto su casa y mi objeto de casa. Estos dos están utilizando la función de impresión. Y debido a que el hotel extiende la casa, ahora tenemos acceso a la función de impresión. Puedo decir mi hotel dot print. Ahora si manejo esto, vemos que las casas propiedad de cada persona y tiene tantos pisos. El hotel sigue diciendo que las casas eran propietarias. Queremos básicamente anular la funcionalidad exacta para la función de impresión dentro de la clase de hotel. Para ello, echemos un vistazo a la clase de casa muy rápido. Nuestra impresión funciona como impresión vacía pública. Nuestra clase de hotel necesita tener la misma función exacta. Puedo decir público, vacío, impreso. Y ahora por simplicidad, simplemente voy a copiar y pegar aquí la línea anterior. Puedo usar Control C en Windows o Comando C en Mac. Y luego puedo seguir adelante y usar el control V en Windows o Comando V en Mac. Ahora nos da un error porque estas dos propiedades son privadas y no están protegidas. Por lo que necesito utilizar sus captadores correspondientes. Por lo que podría decir Obtener el nombre del propietario. Todavía no tenemos un don por su método. Entonces si digo git floors, en realidad no existe. Además adelante y haz uno. Debería ser bastante simple, supongo que un int public get Flores dentro de aquí, simplemente puedo volver false. Por lo que ahora tenemos un getter que podemos usar. Dentro del hotel. Ya no tenemos un error aquí. Podemos cambiar. La casa es propiedad de dos, el hotel es imparcial. Ahora si corro esto y miramos nuestra consola, aquí vemos que el hotel es propiedad de Alex y tiene diez pisos, o los objetos anteriores de la casa aún dicen casa. Esto es lo que es el polimorfismo, que tenemos muchas formas de la misma función exacta. Entonces aquí tenemos una función de impresión en nuestra casa, y aquí tenemos una función printf en nuestro hotel. Siempre que estamos tratando de acceder a una función de impresión, siempre vamos a usar la más cercana a la clase exacta. Por ejemplo, ahora que tenemos esta función printf, usará esta. Pero de antemano no lo tenía. Por lo que se vería a la clase de casa que estamos ampliando. Y por supuesto, house sí tenía una función printf. Por lo que entonces usaría eso. Ahora, esto también se conoce como un concepto de sobrescritura de métodos. Ahora bien, esto no está destinado a confundirse con la sobrecarga de métodos. Aquí es donde tenemos dos métodos del mismo nombre exacto, pero quizás parámetros diferentes. Por ejemplo, puedo decir public, void, print, y como argumento puedo decir int times. Aquí voy a recorrer una cierta cantidad de veces dependiendo de cuántas veces se pase. Puedo decir por int a es igual a 0, mientras que a es menos que veces más una. Ahora dentro de aquí solo podía copiar y pegar esta línea aquí mismo, o simplemente puedo llamar a la función de impresión. Así que ahora volviendo a nuestra clase principal, simplemente estamos imprimiendo esto, pero también podemos decir mi hotel dot print y pasar en cinco. Y ahora puedo ejecutar esto. Y aquí vemos que se imprime cinco veces diferentes. Ahora por supuesto, vemos cinco veces aquí mismo. Pero también tenemos esta sexta vez en la cima. Y eso es porque aquí mismo estamos diciendo mi hotel dot print sin ningún argumento real. Entonces por lo tanto se va a utilizar la función printf normal que creamos. Ahora ya hemos pasado por encima de la sobrecarga de métodos. Esto no es realmente un repaso. Esto es solo para aclarar que la anulación de métodos es diferente a la sobrecarga de métodos. Obviamente, pueden confundirse porque hay palabras similares, pero son conceptos diferentes como puedes ver aquí. 36. La palabra clave "estática": Hasta ahora tenemos diferentes propiedades dentro de nuestras clases, por ejemplo, nombre del propietario y pisos. Y estos van a estar atados a cada objeto individual que creamos. Por ejemplo, mi casa, tu casa, y mi hotel. No voy a introducir una nueva palabra clave, que es la palabra clave estática, que podrías ver aquí mismo. Esto básicamente no va a atar las propiedades a los objetos individuales, sino más bien lazos de propiedades a la clase misma. Ahora cada casa individual es diferente, por lo que es difícil para mí describir un ejemplo estático cuando se trata de casas. Entonces vamos a usar pájaros en su lugar. Puedo hacer clic derecho en nueva clase Java. Y voy a nombrar a esto un pájaro. Ahora digamos que cada ave va a tener su propio nombre. Por lo que puedo decir tipo de cadena privada. Y entonces aquí puedo decir pájaro público en un constructor, podemos tener una cadena aquí llamada type. Y luego dentro del constructor podemos asignar el tipo de variable local igual a los parámetros pasados desde el constructor. Aquí puedo decir que este tipo de punto es igual a tipo. Todo parece bastante básico hasta ahora, vamos a entrar en mi clase principal y voy a comentar estos fuera. Los vamos a descomentar en futuros videos cuando volvamos al ejemplo de la casa. Pero de nuevo, estática es mucho más fácil de entender y para mí explicar sin usar casas. Aquí puedo decir pájaro, pájaro es igual a pájaro nuevo. Tengo acceso a un pájaro, pero ahora tengo el pase en cierto tipo. Por ejemplo, puedo pasar en un cuervo, y ahora tenemos acceso a un pájaro. Todo parece bastante estándar hasta ahora. Ahora, las propiedades estáticas como variables y métodos entran una vez que quieres rebotar algo a la clase misma. Como mencioné, la casa tiene el nombre del propietario y los pisos que están ligados a cada objeto individual creado a partir de esta clase de casa. Entonces en nuestro archivo principal aquí tenemos mi casa, que la va a tener en propiedades de nombre propietario y pisos. Y entonces tu casa tendrá diferentes propiedades, también llamadas nombre antiguo y pisos. Y mi hotel tenía lo mismo porque esto está ampliando la clase de casa. Pero si entro en pájaro aquí, puedo crear algo conocido como variable estática. Como digo, público, estático, int alas es igual a dos. Ahora si vuelvo a mi archivo principal aquí, cuando voy a acceder a las alas de pájaro, vemos que en realidad no existe. Eso es porque de nuevo, las variables estáticas no están atadas a los objetos en sí ave. El objeto siendo este objeto que creamos aquí mismo. En cambio, están atados a la clase real. Entonces alas de pájaro. Así que ahora si corro esto, vamos a ver la cantidad de alas en esta casa de pájaros. En este caso son dos. Pero ¿por qué usar static aquí en lugar de solo hacer una variable normal? Vamos porque esto sólo se crea una sola vez. Y de lo contrario, por ejemplo, con el tipo de cadena, esta variable aquí se crea cada vez que hacemos una nueva instancia de nuestra clase Bird. Volviendo al ejemplo de la casa, tenemos tres instancias diferentes de nombre de propietario y pisos porque no tenemos tres objetos diferentes que los vayan a utilizar. Pero si tuviera tres pájaros diferentes, aún tendríamos sólo un entero llamado alas. Entonces variables estáticas como esta de aquí se van a usar siempre que tengas una clase que tenga una pieza de información compartida. Entonces por ejemplo aquí las aves tienen dos alas y eso nunca va a cambiar. Tenerlo como variables locales como las alas int privadas equivale a dos. No tiene mucho sentido porque esto nunca va a cambiar. Entonces, por lo tanto, no necesitamos tener una variable de alas atada a cada objeto individual que creamos. En cambio podemos simplemente atarlo directamente a la clase. Ahora también podemos tener métodos estáticos. Puedo decir público, estático, int, obtener alas por ejemplo. Aquí simplemente podemos devolver alas. Ahora típicamente métodos estáticos solo se van a usar siempre que esté tratando de acceder o usar unas variables estáticas o algún tipo de funcionalidad o para devolver cosas como un simple getter aquí mismo. Ahora en mi clase principal, no puedo imprimir punto de pájaro obtener alas. Y por supuesto esto tendrá el mismo resultado porque simplemente estamos devolviendo la misma variable, pero similar a la variable bird dot get wings en realidad no existe. Porque de nuevo, las propiedades estáticas y los métodos estáticos están ligados a la clase, no atados al objeto creado a partir de la clase. 37. Clases abstractas: Hasta ahora hemos echado un vistazo a clases normales, como nuestra casa, nuestro pájaro, y nuestras clases de hotel. Pero ahora vamos a echar un vistazo a algo conocido como clases abstractas. Este es un tipo diferente de clase que no podemos usar directamente. Por ejemplo, si voy a mi clase de aves y hago de esta una clase pública abstracta, aquí no pasa nada directamente. Todo parece normal. Pero si volvemos a nuestro archivo principal, aquí tenemos un error porque no podemos usar directamente clases abstractas. Se trata de clases que están diseñadas para ser utilizadas únicamente con clases que las extienden. Por ejemplo, aquí puedo hacer una nueva clase y voy a llamar a esto un cuervo. Esto va a extender la clase de aves. Extiende Pájaro. Y ahora tenemos que crear nuestro propio constructor porque tenemos aquí un constructor no predeterminado. Por lo que puedo decir público crecer el parámetro siendo el mismo exacto que el ave. Entonces tipo de cadena, como podemos ver aquí mismo, volviendo a nuestra clase CHRO, podemos llamar a esta super función pasando de tipo. Ahora todas las flechas deberían desaparecer. Si volvemos a nuestra clase principal. Y en lugar de usar pájaro directamente, ahora voy a decir cro, gro es igual a un nuevo CRO. Ahora tenemos acceso a esto y habíamos tenido que pasar todavía en una cuerda. En este caso, pasaremos en nombre de Crow. Y esto técnicamente es un pájaro porque cro extiende Bird. Pero, ¿por qué querrías tener una clase abstracta que necesita ser extendida? No podemos usar esto directamente. Bueno, ahí es donde entra el concepto de funciones abstractas. Entonces por ejemplo, aquí puedo decir abstracto público, vacío. Puedo llamar a esto Singh. Y no voy a incluir ningún cuerpo de función. Si yo fuera a hacer eso, tenemos un error. Si pongo el cursor sobre esto y ahora dice que los métodos abstractos no pueden tener un orinal. Entonces aquí sólo voy a crear la declaración de una función, pero no hay ningún órgano adherido a ella. Ahora cada clase se había extendido, la clase de aves se ve obligada a extender esta función sinc. Si vuelvo a un cuervo, aquí tenemos un error. Si pongo el cursor sobre él, dice que la clase Crow debe ser declarada abstracta o implementar los métodos abstractos. Viendo en bert aquí puedo decir público, vacío, cantar. Entonces puedo imprimir un sonido que un cuervo podría hacer. Por ejemplo, esto. Ahora si vuelvo a mi expediente principal, ahora puedo decir Crow dot pecado. Y si ejecuto esto, entonces vamos a ver que esto imprimimos a la consola. Ahora digamos que tengo otra clase aquí. Voy a llamar a esto un Robin. Puedo tener este ave alargada. Para que podamos crear nuestro propio constructor. Así público Robin, tipo de cadena. Entonces podemos pasar en estos dos son super método que llamaremos el constructor de ave. Ahora todavía tenemos que anular el método toString. Vacío público, canta. Aquí voy a imprimir tweet, tweet. Y ahora puedo hacer una instancia de robin diciendo Robin, Robin es igual a nuevo robin, pasando aquí a Robin. Y entonces ahora puedo decir Robin dot pecado. Si corro esto, vamos a ver los dos sonidos diferentes que harán las aves. Y esto es útil porque la clase de aves es una clase abstracta, lo que significa que tiene mucha configuración, pero no está destinado a ser utilizada directamente. Está destinado a ser utilizado con otras clases que van a tener una funcionalidad específica. Por ejemplo, cada ave podría hacer un ruido ligeramente diferente. Y así queremos obligar a cada tipo de ave a implementar esa funcionalidad directamente. 38. Interfaces: Ahora echemos un vistazo a las interfaces, que tiene algunos conceptos similares a las clases abstractas, que solo tendrían que mirar. Pero tienen algunas diferencias clave. Por ejemplo, aquí tenemos una clase abstracta de pájaro. Y las clases abstractas normalmente tendrán solo cosas normales dentro de las clases, por ejemplo, diferentes métodos y variables. No obstante, también generalmente vamos a tener una función abstracta que cualquier clase que extienda la clase de aves se ve obligada a implementar. Hemos echado un vistazo a esto en el último video con nuestra clase CRO y Robin, donde necesitamos ahora anular el método de cantar. Ahora una cosa a tener en cuenta es que cada clase en Java solo puede extender otra clase, pero podemos usar tantas interfaces como queramos. Por ejemplo, aquí en mi proyecto, voy a hacer una nueva clase Java. Y voy a cambiar esto a una interfaz aquí mismo. Y voy a nombrar a este animal. Ahora dentro de este animal, no podemos tener un constructor, por ejemplo, animal público. Esto va a causar un error. Los únicos métodos que podemos tener aquí son los métodos abstractos. Digamos que quiero que mi clase Robin y Cro implemente esta interfaz animal. Esto también significará que cada animal que haga en el futuro, ya sean vacas, perros, serpientes, cualquier cosa tendrá que implementar esto. Por lo que esto solo debe contener cosas que son específicas de cualquier animal individual, digamos int pública, vida media. Y de nuevo, estos van a ser métodos abstractos. Así que no puedo escribir un cuerpo de función real aquí porque de nuevo, esta es una interfaz. Sólo podemos tener funciones por sí mismos. Pero si entro en micro clase, por ejemplo, puedo hacer que estos implementos sean animales. Ahora nos da un error. Si pongo el cursor sobre esto, dice que clase Crow debe ser declarada abstracta o implementar el método abstracto vida media en animal. Aquí puedo decir pública int vida media. Y esto va a devolver ocho. Ahora ya no obtenemos un error en ninguna parte. Voy a mi Robin, ahora puedo decir implementos animal. Tendríamos que hacer exactamente lo mismo. Int público, vida útil promedio. Aquí puedo volver a. Ahora puedo volver a mi archivo principal y puedo imprimir grow dot promedio de vida útil, y puedo imprimir robin dot vida útil promedio. Por corrida esto vamos a ver 82 respectivamente. Y podría estar pensando que podemos lograr este mismo concepto exacto con solo agregar en la función tiene un método abstracto a nuestra clase Bird. Y eso es cierto. Y después de las clases son similares a las interfaces de alguna manera. Pero la principal diferencia aquí es que normalmente querrías usar una interfaz siempre que solo tengas funciones abstractas y no tengas ningún otro tipo de funciones. Y una diferencia clave aquí, como mencioné anteriormente, es que podemos implementar tantas interfaces diferentes como queramos. Por ejemplo, si tuviera otra interfaz llamada animal a, podría implementarla aquí. Estos están separados por comas, pero en Java solo podemos extender una sola clase. Entonces esa es una de las ventajas que tienen las interfaces es que se pueden utilizar tantas de ellas como sea posible. Por lo tanto, normalmente desea usar interfaces a menos que tenga sentido utilizar realmente una clase. Por ejemplo, tiene una funcionalidad predeterminada que debe ser heredada o técnicamente extendida por cada clase secundaria. Pero de lo contrario, si solo tienes estas funciones aquí, que cada clase secundaria individual, como Robin y Cro, realidad debería anular e implementarse, entonces deberías usar una interfaz. 39. Instancia de: ¿ Y si quisieras revisar ciertos tipos de clases contra otros tipos de clases? Por ejemplo, voy a empezar con el código con el que dejé fuera en el último video, pero voy a deshacerme de todas las declaraciones impresas aquí mismo. Acabamos de tener un cuervo y un robin. No puedo tener una declaración if diciendo si un cuervo es una instancia de un pájaro, puedo imprimir Crow es un pájaro. Y aquí obtenemos esta advertencia. Si me pongo sobre él, dice que la incidencia de crecimiento condicionado de aves siempre es cierto. Eso es porque esta fila de aquí es solo una variable que creamos, pero nunca la estamos cambiando en absoluto. Se sabe con certeza que esta es una instancia de un pájaro porque cro extiende Bird como vemos aquí mismo. Ahora claro, si yo dirijo esto, es co-invertir, digamos que un cuervo es un pájaro, como vemos aquí mismo. Pero esto también se puede hacer con interfaces. Entonces un cuervo es una instancia de un animal. Ahora si ejecuto esto, vamos a obtener la misma respuesta exacta que vemos aquí mismo. Por supuesto, técnicamente deberíamos cambiar la frase para decir que un cuervo es un animal. Pero te dan la idea. Instancia de puede ser útil si queríamos comprobar si un determinado objeto es una instancia de otra clase o una interfaz. Y este es un caso más de uso para interfaces porque técnicamente no necesariamente tienes que tener nada dentro de tu interfaz y seguirá funcionando. Por ejemplo, un robin sigue implementando animal, y el CRO sigue implementando vida útil media animal ahora solo se convierte en un método normal que se adjunta a la clase de cuervo y adscrito a la clase robin respectivamente. Y no tiene nada que ver con la interfaz animal. Pero ahora que un robin y CRO son ambos animales porque todavía estamos implementando la interfaz. Todavía podemos usarlos y cheques como este. 40. Enums: Ahora vamos a estar alejándonos programación orientada a objetos y entrando en otros aspectos de Java. Por ejemplo, en este video, vamos a aprender sobre las enumeraciones, que significa enumeraciones. Básicamente, estos son tipos específicos de valores que son una especie de variables similares, pero no pueden cambiar y se pueden utilizar de maneras muy específicas. Así que sigamos adelante y hagamos aquí un nuevo archivo. Para que podamos seleccionar la clase Java. Entonces aquí podemos seleccionar enum. Voy a llamar a estos días de la semana. Puedes tener enumeraciones para tener los valores que quieras. Pero típicamente estas van a ser cosas que nunca deberían cambiar. Por lo que técnicamente no son como una variable donde podrías tener entrada de un usuario o algún tipo de número aleatorio. Estas son cosas que van a ser concretas y siempre usar de la misma manera exacta. Un buen ejemplo de esto son los días de la semana, que no cambiarán. Aquí, voy a sumar en una coma dominical. Me di cuenta de cómo estoy escribiendo en todas mayúsculas. Esta es una convención común cuando realmente se usan enumeraciones. Entonces entonces podemos tener lunes, martes, miércoles, jueves, viernes y sábado. Obviamente deletreas correctamente. Ahora tenemos estos siete valores diferentes dentro de nuestra enumeración, pero ¿cómo realmente los usamos y cómo son útiles? Entonces volviendo a nuestro archivo principal, aquí, puedo decir días de puntos de semana. Y luego puedo acceder a cada valor individual si quisiera. O puedo conseguir todos ellos como una matriz. Aquí vemos que el método values está integrado en enumeraciones y devuelve días de semana como una matriz. Pero por ejemplo, si quisiera imprimir días de semana el viernes, entonces puedo ejecutar esto. Aquí vemos el viernes en la consola. También podemos utilizarlos con declaraciones a if. Ahora, cada valor de enumeración individual también tiene un conjunto de métodos diferentes. Por ejemplo, podemos compararlo con otra instancia de días a la semana. Podemos conseguir el nombre, podemos conseguir el ordinal a menos que le dé un vistazo rápido a estas dos cosas. Entonces fui a imprimir el nombre. Entonces voy a copiar y pegar esta línea. Y voy a imprimir lo ordinal. Ahora si corro esto aquí, vemos el viernes de nuevo, y luego 55 va a ser el índice real de que se usa esto. Por ejemplo, el domingo es 0. Ahora no tienes que añadir en estos comentarios, solo estoy haciendo esto para que sea más fácil para nosotros leer esto en realidad. Entonces aquí tenemos 012345, y por supuesto el sábado sería seis, pero por eso vemos cinco y nuestra consola. Voy a deshacerme de todos estos. Y ahora vamos a expandirnos en esta enumeración. Por ejemplo, digamos que no quiero que el viernes sea todo en mayúsculas, sino más bien quiero reescribir una cadena específica como nombre de ese día. Tan similar a las clases, las enumeraciones en realidad pueden tener su propio constructor. Voy a poner un punto y coma al final de todos mis valores en este caso tenía un sábado. Y entonces aquí puedo decir días de semana. Ahora podrías notar que aquí no tengo público ni privado ni nada por el estilo. Eso es porque si pongo el cursor sobre este error, dice modificador público no permitido aquí. El motivo de eso es esta función constructor aquí mismo solo se puede ejecutar dentro de la enumeración misma. Por ejemplo, dentro de paréntesis dominical. Aquí pasaríamos en diferentes argumentos al constructor. No podemos acceder a este constructor fuera de este archivo de eNode. Pero ¿por qué necesitaríamos un constructor en primer lugar? Bueno, en realidad podemos almacenar a diferentes valores para cada valor de enumeración individual. Similar a las propiedades privadas de una clase, supongo que digo nombre de cadena privada, supongo un booleano privado, Workday. Y luego dentro del constructor, puedo requerir estas dos propiedades. Entonces nombre de cadena, Boolean, Workday. Entonces puedo decir this.name es igual nombre y este punto workday es igual a jornada laboral. Ahora obtenemos algunos errores en cada uno de nuestros valores. Y eso es porque por defecto va a llamar a un constructor sin argumentos incorporados. Pero por supuesto, si pongo el cursor sobre esto, va a esperar una cuerda y un booleano. Aquí. Puedo pasar el domingo y luego puedo decir falso por ser una jornada laboral. Voy a hacer lo mismo por todos estos. Entonces por ejemplo, lunes y verdad, como digo martes y verdad, miércoles y un verdadero. Entonces puedo pasar el jueves. Y cierto. Aquí tenemos un viernes y verdadero, y luego finalmente, sábado y falso. Ahora ya no tenemos más errores a menos que tratemos de usar uno de estos dentro de nuestro archivo real aquí. En lugar de días a la semana dot Theta dot name, ¿puedo acceder a los valores reales como el día de la semana? Y no podemos, en realidad tenemos que hacer nuestros propios captadores públicos para poder hacer eso. Aquí puedo decir pública, cadena getName. Ahora puedo devolver nombre. Entonces puedo decir que el booleano público es Workday, y ahora puedo regresar jornada laboral. Getname no es un nombre realmente bueno para el método. El motivo de eso es que esto se puede mezclar fácilmente con el nombre. Por ejemplo, tenemos nombre y getName. No está muy claro cuál queremos. Una cosa que podemos hacer es que podamos renombrar esto para obtener Nombre Display. Ahora un nombre para mostrar como algo que normalmente se va a mostrar a los usuarios. Entonces algo con una F mayúscula y minúscula, todo lo demás sería un mejor nombre para mostrar que todo siendo una mayúscula, todo siendo una mayúscula, parece un extraño para el usuario. Y así una F mayúscula con todo en minúsculas, en realidad es como dirías esto. Normalmente, este sería un nombre para mostrar apropiado. Volviendo en lugar de getName, ahora puedo decir que los niños muestran el nombre. Entonces claro aquí voy a decir que el viernes dot es jornada laboral. Creo que adelante y corre esto. Deberíamos ver el nombre para mostrar así como si se trata de una jornada laboral, que en este caso S tiene viernes y verdadero. Ahora en realidad se puede utilizar enumeraciones como tipos de variables. Por ejemplo, puedo decir días de semana, día es igual a días de semana, lunes. Entonces puedo decir si el día es jornada laboral, puedo imprimir ir a trabajar hoy. De lo contrario, puedo imprimir es un fin de semana. Ahora si ejecuto esto, vamos a ver ir a trabajar hoy porque estábamos accediendo al valor Day, que es igual a lunes. Pero claro, si cambio esto a sábado y corro esto, ahora vemos que es un fin de semana. Ahora solo hay una cosa más que quería mostrarte con enumeraciones, y esa es la capacidad de recorrer todas ellas, como digo, cuatro días de semana, día. Aquí puedo pasar en días a la semana valores de puntos. Si pongo el cursor sobre esto, vemos que esto devuelve una matriz de días a la semana. Esta será una matriz de cada valor individual como elemento propio. Dentro de aquí puedo imprimir punto de día, conseguirnos por nombre, luego un colon. Entonces puedo sumar el día es Workday. Si ejecuto esto, va a recorrer todos los días. Se va a imprimir su nombre así como un booleano si es una jornada laboral o no. Obviamente con una enumeración, no estamos recibiendo ninguna entrada externa de otras partes del programa. Todo con una enumeración o auto-cerrado, lo que significa que los argumentos pasaron al constructor o simplemente valores estáticos que en realidad no son variables. Como se puede ver, solo le estoy pasando una cadena y un paso en un valor booleano. No voy a pasar ninguna variable. Las enumeraciones son útiles siempre que tengas algo así como los días de la semana donde son concretos y nunca van a cambiar. Ni siquiera las variables que pasan el constructor, no van a cambiar. Esto tiene muy útil si alguna vez tienes cosas que son muy concretas como esta, porque entonces puedes acceder fácilmente a ellos y referencia a ciertos valores sin preocuparte por ellos siempre cambiantes. 41. Intenta capturar por fin: En un video anterior, cuando usamos escáneres, vimos cómo se ve un error. Vamos a seguir adelante y recrear eso. Puedo crear un escáner. Yo lo llamo input y yo sine es igual al valor de nuevo Escáner. Aquí puedo pasar en sistema.En. Todo esto debería ser bastante familiar para usted desde antes en el curso. Ahora aquí simplemente voy a imprimir punto de entrada next int. Y si ejecuto esto, va a esperar que entre un entero. Por ejemplo, si entro cinco, todo funciona bien y el proceso terminó con un código de salida exitoso, que es 0. Pero si vuelvo a ejecutar esto y entro una cadena como test, ahora obtenemos una excepción. Esto es básicamente solo un error. Y a primera vista esto podría parecer realmente confuso, pero en realidad es muy simple. Básicamente tenemos una excepción en el hilo principal y va a tener una lista de dónde vinieron todos los errores. Esto se conoce como un rastro de pila. Y esto es básicamente rastreando exactamente de dónde vino el error. Ahora bien, todos estos son en realidad clickable, y de hecho vemos el nombre del error aquí mismo como excepción de falta de coincidencia de entrada. Eso sucede cuando entramos algo que no es del tipo adecuado. En realidad puedo hacer clic en uno de estos, por ejemplo, escáner dot Java. Y esto va a abrir la piel o clase, que tiene un montón de cosas de las que en realidad no tenemos que preocuparnos . Voy a cerrar fuera de eso. Pero lo más importante es que podemos hacer clic en nuestro propio código. En realidad podemos ver esto en azul. Si cierro de todos mis archivos, entonces puedo hacer click en esto de aquí mismo, va a abrirlo y ponerme en la misma línea exacta donde está el error. Bonito, pero ¿cómo solucionamos esto en realidad? Podemos usar algo conocido como try-catch. Voy a añadir un comentario aquí. Tenemos try-catch y también tenemos otra opción conocida como finalmente, la sintaxis para esto sería probar llaves rizadas, y luego hay que añadir en un catch. Esto va a tener una excepción. Llamaré a esto una excepción aquí. Y hay diferentes tipos de excepciones. Normalmente, no quieres tener aquí una excepción genérica, sino que quieres usar el tipo exacto de excepción que esperas atrapar. En este caso, es una excepción de falta de coincidencia de entrada, como podemos ver en la traza de pila aquí mismo. Entonces, en lugar de solo decir excepción, voy a decir excepción de falta de coincidencia de entrada. Ahora dentro de aquí puedo decir e dot print stack trace. Y esto es básicamente sólo va a hacer lo mismo exacto que vemos en nuestra consola aquí mismo. Para probar esto, puedo tomar estas declaraciones de línea de impresión. Puedo ponerlo dentro del try-catch. Si ejecuto esto, vamos a obtener los mismos resultados exactos. Si entro en algo que no es un entero, por ejemplo, esta cadena. Aquí vemos el error exacto. Entonces, ¿qué está pasando aquí exactamente? Bueno, básicamente vamos a probar este código aquí mismo. Si algo no funciona, entonces va a lanzar un error. Ahora por defecto, si no detectamos un error, el programa se va a estrellar. Para probar esto, puedo traer esta línea de vuelta aquí mismo. Y voy a comentar nuestro try-catch por ahora. Y para hacer esto con múltiples líneas, solo puedes seleccionarlas todas y luego hacer control de barras inclinadas hacia adelante o Command forward slash en un Mac. Ahora dentro de aquí voy a imprimir trabajado. Esto es después de que estuviéramos recibiendo la siguiente entrada int. Si ejecuto esto, me va a pedir un número. Voy a entrar cinco y ha funcionado. Pero si vuelvo a correr esto y entré a prueba, no va a decir trabajado. Eso es porque el programa realmente se estrelló. Y así todo lo pasado no va a ser rampa. Esta es la razón principal por la que quieres usar try-catch. Porque si imprimo funcionó después esto y ejecuto el programa aquí, puedo entrar en prueba. Y aún va a arrojar el error porque lo estamos imprimiendo por la línea 14, editar, imprimir rastro de pila. Pero no va a estrellarse el programa. Y vemos eso porque estamos imprimiendo funcionó directamente después. Siempre que tengas algún código que podría arrojar una excepción, querías asegurarte de atrapar esa excepción y luego manejarla en consecuencia. En algunos casos, esto podría ser imprimirse. No ingresaste un número y no necesariamente necesitamos imprimir un rastro de pila. Entonces voy a quitar eso. Ahora si corro esto y entro intestino, no vamos a ver el error. En cambio, sólo vamos a verlo. No ingresaste un número. Ahora mencioné esto finalmente cosa. ¿ Qué es exactamente eso? Bueno, eso siempre viene después. Intenta atrapar. Aquí puedo añadir. Y por último, esto es algo que se correrá sin importar lo que pase. Así que prueba corrimos una línea a la vez. Entonces correrá esta línea y esta línea y esta línea. Si alguna vez hay una excepción, inmediatamente dejará de intentar ejecutar este código aquí. Y de inmediato saltará a la declaración catch, básicamente corriendo lo que esté dentro de estos tirantes rizados aquí mismo. Y obviamente con eso dicho, este código resaltado aquí solo se ejecutará si hay una excepción. Si todo funciona bien dentro del try-block justo aquí, entonces el código catch nunca se ejecutará. Pero finalmente está pasando corrió pase lo que pase, no importa si todo funcionó perfectamente bien o si hay una excepción, puedo imprimir. Finalmente corrió. Y voy a correr esto aquí dentro. Puedo ingresar un número, digamos diez. Y aquí vemos finalmente se corrió. Si vuelvo a ejecutar esto, puedo ingresar una cadena. Vemos que no ingresaste un número, pero aún vemos finalmente RAN. Ahora bien, esto es útil en muchos casos de uso, pero uno muy específico está fuera del alcance de todo este curso. Eso es básicamente cuando se trata de conexiones de bases de datos. Esencialmente con nuestra declaración try, trataríamos de conectarnos a la base de datos. Dentro de un catch, manejaríamos cualquier error y ejemplo siendo los detalles de inicio de sesión no válidos. Y luego finalmente se va a cerrar cualquier conexión abierta. Ahora en algunos casos de uso, verá conexiones como esta, y este es un buen ejemplo en teoría del viento finalmente se puede utilizar. 42. Errores de lanzamiento: En el último video, echamos un vistazo a cómo manejar diferentes errores. Pero lo que queramos crear nuestros propios errores. Por ejemplo, voy a eliminar todo esto y voy a cambiar este comentario aquí a lanzar un error. Y así lo vamos a llamar cuando queramos crear nuestro propio error. Por ejemplo, aquí puedo decir una cadena. Siguiente cadena es igual a punto de entrada siguiente línea. Ahora dentro de aquí voy a decir si siguiente punto de cadena es igual a ignorar error de caso, no quería lanzar mi propio error. Para ello, puedo decir lanzar nueva excepción y puedo pasar en una cadena. Y este será el mensaje que se imprime a la consola. Por ejemplo, se dio un error del usuario porque el usuario ingresa la cadena aquí mismo como error. Pero tenemos un error ahora mismo. La solución aquí es agregar la excepción a la firma del método. Si hago clic en esto, nuestro método principal ahora dice lanza excepción. Esto básicamente le dirá a Java que dentro de esta función, vamos a estar lanzando nuestra propia excepción. Ahora, fuera de nuestra declaración if, puedo imprimir cualquiera que sea la siguiente cadena del usuario. Voy a seguir adelante y correr esto. Y dentro de aquí voy a entrar HelloWorld y debería imprimir hola mundo y todo funciona como se esperaba. Pero si ejecuto esto una vez más, no puedo imprimir error. Y esto entonces hará que esto si la declaración sea verdadera. Entonces si presiono Enter, ahora vamos a conseguir nuestra propia excepción. Aquí tenemos la cuerda. Dice que se le dio un error por parte del usuario, y podemos hacer click sobre esto para luego ver dónde se arrojó la excepción. Ahora tal vez te estés preguntando, ¿por qué alguna vez querríamos hacer esto? ¿ Por qué no simplemente decirle al usuario que no introduzca el error de cadena? Bueno, una de las razones por las que quieres hacer esto es que los programadores que estén usando tu código o tú mismo con otras partes de tu proyecto se ven obligados a atrapar ciertos errores e interactuar correctamente. Por ejemplo, si estás creando tu propio programa que otros desarrolladores estarán descargando e importando. A continuación, puedes lanzar diferentes errores para que los desarrolladores luego se vean obligados a atraparlos y manejarlo de acuerdo a cómo quieran. Dependiendo del tipo de error que sea. El mismo concepto va para tus propios proyectos. Puedes arrojar ciertos errores cada vez que ciertas cosas están sucediendo. En otras partes de su programa, puede utilizar el sistema try-catch para resolver realmente ese problema. 43. Listas y listas de matrices: Nuevo el inicio del curso, tuvimos que mirar matrices, pero ahora vamos a echar un vistazo a las listas y ArrayLists. Estas básicamente van a ser formas más avanzadas de usar matrices. Y en muchas situaciones que van a ser más fáciles de usar y más poderosas. Entonces digamos que quiero tener una matriz de enteros, como digo int números iguales a corchetes. Y aquí puedo añadir en mi lista de números, por ejemplo, 123. Ahora digamos que quiero seguir adelante y sumar un cuarto elemento. Bueno, si digo números índice tres es igual a cuatro, ahora vamos a tener un error. Si pasa el cursor sobre esto, dice índice de matriz fuera de límites. Básicamente lo que significa que cualquier matriz no puede tener cosas nuevas agregadas a ella. Tendrías que crear una matriz completamente diferente. Por ejemplo, podría decir que los números son iguales a una nueva matriz entera con 1234 en ella. Y esto funcionará. Pero obviamente no quiero tener que hacer esto. Quiero la capacidad de simplemente agregar algo a esta matriz. Pero por defecto, las matrices no tienen esta funcionalidad. Por eso tenemos listas de matriz. Estas son formas mucho más fáciles usar matrices donde podemos quitar cosas fácilmente, agregar cosas, por supuesto, acceder, cosas similares al borrado existente. Voy a seguir adelante y comentar esta línea por aquí. Y voy a hacer un nuevo ArrayList. Ahora el primer paso es crear una lista genérica. Esto va a ser de Java util. Esta va a ser una interfaz, como podemos ver desde el ícono verde aquí mismo. Ahora dentro de aquí tenemos que pasar en qué tipo de datos estamos mirando a una tienda y no podemos pasar un int porque esto tiene un tipo primitivo, necesitamos pasar en cierta clase. Dentro de Java, tenemos acceso a entero, que es una clase. Y esto nos va a permitir usar enteros dentro de esta lista. Entonces voy a llamar a este número de lista. Por lo que podemos asignar esto igual a un nuevo ArrayList. Ahora aquí tenemos apenas menos que y mayor que firmar. Y luego estos paréntesis, los menos que y mayores que signo, podrían contener el valor HEPA que desea, por ejemplo, un entero. Pero en el Java moderno, no necesitamos hacer esto. Básicamente va a acceder a qué tipo de valor necesitamos del entero que pasamos aquí mismo. ¿ Qué exactamente acaba de pasar? Bueno, si me pongo por encima de la lista aquí, vemos que esta es una interfaz, como vemos aquí mismo, interfaz pública. Y esto nos da una serie de diferentes funcionalidades incorporadas que las listas más diferentes van a tener. Ahora después de decir eso, debería haber mencionado que ArrayList no es el único tipo de lista, sino que es la más fácil de entender y la más fácil de demostrar. Lo vamos a utilizar para este tutorial. Ahora, ArrayList es su propia clase que va a implementar la interfaz de lista. Por lo que va a conseguir toda la funcionalidad que ofrece la lista, pero también construir sobre ella. Esto es genial y todo, pero ¿cómo uso realmente la lista de números? Bueno, aquí puedo decir números punto. La primera opción es en absoluto donde podemos pasar en una colección diferente, como otra lista y agregarle todos los elementos. O podemos añadir un elementos individuales como un entero. Por ejemplo, uno. Ahora si tuviera números punto aquí, podemos añadir un cierto elemento a un determinado índice. También podemos borrar la lista. Podemos ver si está vacío, hay un montón de otras opciones como eliminar ciertos elementos, obtener el tamaño actual o la cantidad de elementos en la lista, y muchos, muchos más. Vamos a seguir adelante y sumar los tres números que queríamos a esta lista. Números, no añadas dos números, punto suman tres. Ahora los números ArrayList es muy similar a la matriz de números que ha comentado. Ahora obviamente en un ejemplo tan simple, no importará. Pero si realmente queremos agregar, digamos, diez o 100 números, podemos recorrer fácilmente esos números y luego pasarlos a la función add aquí mismo. O si queríamos, podemos pasar en una matriz al nuevo constructor de lista de matrices aquí mismo. Ahora no podemos simplemente pasar en una matriz genérica. Tenemos que decir matrices con un capital un punto como lista. Ahora dentro de aquí, vamos a tener unos varargs con cualquier número de enteros. Por lo que puedo decir 123. Ahora si elimino esto, todavía vamos a tener el mismo resultado exacto. Entonces, si tienes una matriz existente, puedes pasarla fácilmente, similar a la sintaxis como esta. Pero típicamente no vas a hacer esto. La mayoría de las veces. Solo vas a crear un ArrayList y luego agregarle cosas como necesites. Así que vamos a seguir adelante e imprimir todo aquí. Puedo imprimir números. Y si corro esto, ahora vemos 123. Vamos a seguir adelante y tratar o mover algunos elementos de aquí. Puedo decir números dot remove. Aquí podemos pasar en un objeto específico o un entero específico. Un entero no va a eliminar ese elemento específico. Esto realmente va a eliminar el índice. Me muevo el índice uno, que va a ser el valor dos. Ejecuto esto, ahora vemos sólo 13 en nuestra matriz, como lo hacemos aquí mismo. Pero, ¿qué pasa si en realidad quiero simplemente eliminar el número dos? Bueno, como digo, valor entero de y pasar a. Ahora si corro esto, vamos a ver 13 como lo hacemos aquí mismo. Ahora esto podría parecer un poco raro. ¿ Por qué realmente tenemos que hacer esto? Bueno, si digo números punto eliminar aquí, vemos que este es un método sobrecargado. Podemos pasar en un índice o un condensador, un objeto para pasar solo el número dos o el número uno o cualquier tipo de entero básico. Se va a tratar eso como un tipo primitivo de int. Va a utilizar la muestra del tema aquí mismo. Pero si pasamos en una clase específica o un objeto que represente algo, entonces va a usar la segunda opción aquí mismo. Esto es exactamente lo que estamos haciendo con esta línea de código aquí mismo. Esto va a pasar en un objeto y no sólo un entero primitivo. Después pasará por el ArrayList y tratando eliminar cualquier elemento que coincida con este valor aquí, que en este caso lo hace, como vemos, no vemos el número dos. Ahora vamos a imprimir cuántos elementos hay en lo surrealista. Por lo que podría decir números tamaño de punto. Si dirijo esto aquí, vamos a ver dos en la consola. Y también podemos aclarar esto. Entonces sigamos adelante y digamos números. Punto claro. Ahora si ejecuto esto, en realidad va a despejar esto después de que imprimimos los dos números como vemos aquí mismo. Pero nuestro tamaño está ahora en 0 porque en realidad hemos limpiado el ArrayList. Ahora un ArrayList y escucha general se conoce como una colección. Es básicamente una clase personalizada que nos permite agregar ciertas cosas y eliminar ciertas cosas. Y hay un montón de diferentes ejemplos de ellos. En este video y en el siguiente video vamos a repasar dos ejemplos. Pero, honestamente, cubrir cada ejemplo justificaría su propio rumbo justo en eso. Así que sólo vamos a apegarnos a algunas de las colecciones más básicas, de uso más común, como ArrayList y HashMaps, que vamos a echar un vistazo en el siguiente video. 44. Mapas y mapas de hash: Ahora vamos a echar un vistazo a HashMaps, que son una forma de almacenar algo conocido como un par de valores clave. Básicamente significa que por cada clave, hay un valor correspondiente. Echemos un vistazo real a algunos ejemplos. Aquí. Voy a tener un mapa, y esto tiene va a almacenar una clave y valor, que pueden ser dos tipos diferentes de variables. Por ejemplo, la clave puede ser una cadena y el valor puede ser un entero. Similar a ArrayLists, estos tienen que ser los tipos de clase reales. Por lo que no podemos decir int aquí. Tendríamos que especificar entero con un mayúscula I. Dentro de aquí, puedo sumar en diferentes tipos de puntuaciones. Y voy a asignar un igual a un nuevo HashMap. Ahora similar a un ArrayList, podemos agregar en una cadena y entero si queremos. Pero en el Java moderno no es necesario, así que no voy a hacerlo. Ahora, lo que es exactamente un par de valores clave enumerados en estas puntuaciones son para un cierto videojuego. Puedo decir puntajes punto. Y aquí podemos ver que estamos pasando en una cuerda, que es lo que tenemos de esta cadena aquí mismo. Y también estamos pasando un entero de este entero aquí mismo. Este es un par de valores clave. Por ejemplo, digamos que tengo 77 puntos en este juego. Puedo decir puntajes punto puesto. Bob tiene puntos PD en el juego y anota punto puesto aquí, joe tiene 30 puntos en el juego. Vamos a seguir adelante e imprimir esto a la consola. Para que pueda imprimir puntuaciones y puedo correr esto. Y aquí vemos a Alex igual a 77, Joe es igual a 30, y Bob es igual a 80. Pero, ¿qué otras opciones tenemos cuando se trata de esto? Puedo decir puntajes punto aquí. Puedo conseguir una, una cierta cosa. Y ahí fue donde pasaríamos en la cuerda. Por ejemplo, puedo pasar un Alex. Y voy a cortar toda esta línea aquí con Control X o Comando X en Mac. Y entonces puedo imprimir esto. Puedo pegarlo con Control V o Comando V en un Mac. Y si corro esto, vamos a conseguir las puntuaciones para la cuerda Alex, en este caso es 77. Si digo puntajes punto, entonces podríamos aclararlo similar a un ArrayList. Esto simplemente eliminará todas las entradas. Podemos conseguir un juego de entrada o un conjunto de llaves. También podemos conseguir los valores y vamos a echar un vistazo a lo que hacen esas tres cosas aquí en un momento. Podemos ver si está vacío. Podemos reemplazar ciertas cosas. Podemos conseguir el tamaño. Aquí es donde podemos conseguir los valores. También podemos ver si contiene una clave, horrorosa alcanza un valor. Y hay un montón de otras opciones, como eliminarlas. La mayoría de estos son autoexplicativos, otros con los que podrías tener que experimentar o buscar la documentación. Vamos a seguir adelante y tratar de bucle a través de todas las claves o todos los valores o ambos. Voy a deshacerme de estas declaraciones impresas aquí. Voy a decir por clave de cuerda. Y luego aquí vamos a usar un bucle para cada. Entonces tenemos nuestro colon aquí. Ahora puedo decir puntajes conjunto de teclas de punto. Y esto devuelve un conjunto que es similar en concepto a una lista que vimos en el último video. Ahora dentro de aquí puedo simplemente imprimir llave. Si ejecuto esto, va a imprimir a Alex, Bob y Joe, como vemos aquí mismo. Pero ahora, ¿qué pasa si queríamos tener acceso a los valores? Puedo decir puntajes dot v, y aquí tenemos valores. Ahora tendríamos que cambiar esto a un int, supongo que int valor. Y luego puedo imprimir valor. Si ejecuto esto, ahora podemos ver los tres valores de este mapa exacto. Pero, ¿y si quisiera tener acceso a ambos? Bueno, puedo decir para la entrada con una E mayúscula, vamos a usar esto desde el mapa util de Java. Aquí tenemos que especificar qué tipos de variables necesitamos. Entonces en este caso una cadena y un entero. Voy a llamar a esta entrada variable. Entonces con un colon, ahora puedo decir puntuaciones dot EntrySet. Ahora si pongo el cursor sobre conjuntos de entrada, esto va a devolver un conjunto de una entrada que tiene una K y V, que significa clave y valor. Por lo que esencialmente, puedo decir clave de punto de entrada fgetc o punto de entrada obtener valor para obtener acceso a ella. Por ejemplo, la clave de cadena es igual a la entrada, talk KCI, y luego int valor es igual a la entrada dot get value. Entonces puedo imprimir clave que tiene el nombre de usuario, tiene puntos de valor más. Ahora si ejecuto esto, va a imprimir lo que tiene cada usuario y sus puntos correspondientes, como vemos aquí mismo. 45. Crear un archivo de frasco: Estamos a punto de acercarnos al proyecto final para el curso, que va a ser rehacer el juego Battleship dentro de Java. Pero antes de hacer eso, tenemos que asegurarnos de entender cómo convertir realmente nuestro código Java en un archivo ejecutable. Es posible que esté familiarizado con los archivos dot EXE donde puede hacer doble clic en ellos y abrirá un programa. En Java, tenemos un dot jar archivos, que probablemente hayas visto antes. ¿ Cómo convertimos exactamente todo nuestro código fuente en un archivo jar de puntos que realmente podemos ejecutar. Bueno, el primer paso es hacer clic en el engranaje en la parte superior derecha y luego ir a la estructura del proyecto. O puedes usar este confuso atajo aquí mismo. Una vez que estés aquí, quieres ir a la izquierda y hacer clic en artefactos, y luego hacer clic en el más flotar sobre jar y luego ir a desde módulos con dependencias. A partir de ahí, necesitamos especificar una clase principal. Esta es básicamente la clase donde está nuestra función principal. Si hago clic en una Carpeta Abierta, seleccionará automáticamente todos los diferentes archivos que tengan una función principal en ellos. Por lo que sólo tenemos uno. Simplemente podemos hacer click en Okay, y luego hacer click en Okay otra vez. Ahora desde aquí, puedo hacer click en Okay. Entonces puedo hacer click en Construir, construir artefactos. Y desde aquí podemos simplemente presionar Enter o también puedes hacer click en Construir. Vemos que está construyendo algo cerca del fondo. Y ahora que se hace, podemos ampliar nuestro directorio OUT, entrar en Artefactos. Y aquí vemos nuestro espacio de trabajo dot jar. Voy a hacer clic derecho en esto. Entonces podría hacer clic en Copiar referencia de barra de ruta. Y luego desde aquí voy a hacer click en camino absoluto. Si pego esto en, esta va a ser una ruta de archivo a este archivo jar exacto. Ahora para ejecutar esto, no podemos simplemente abrirla. Necesitamos realmente pasarlo a través de una terminal. El motivo de eso si se trata de una aplicación de consola, lo que significa que estamos trabajando dentro nuestra consola como hemos visto a lo largo de todo este programa. Por lo tanto, no tenemos una ventana personalizada con botones e imágenes y todas esas cosas que están fuera del alcance de este curso. No hemos cubierto nada de eso dentro de este curso. Entonces, ¿cómo exactamente manejamos esto? Tenemos que abrir nuestra propia terminal. Si estás en Windows, puedes seguir adelante y hacer una búsqueda o comando, y luego seguir adelante y presionar Intro. Ahora si estás en un Mac porque no soy dueño de una Mac, no estoy seguro de cómo hacer eso, pero simplemente puedes google como abrir terminal en Mac y debería tener un montón de resultados. Así que te ayudaré. Ahora, de cualquier manera, una vez que tenga su símbolo del sistema o su terminal abierto, podría escribir en el espacio Java, dash jar espacio, y luego desea pegar en su ruta. Pero ten en cuenta si tienes espacios en tu camino, necesitas rápidamente todo cosa y comillas dobles. Voy a añadir en códigos dobles aquí. Y luego dentro puedo hacer clic derecho para pegar en el camino. Aquí vemos la carpeta Warnock keys tiene espacios en ella. Por lo que tengo que añadir entre comillas dobles a cada lado. Si presiono Enter, vemos que en realidad no pasa nada. Eso es porque nuestro código en realidad no hace nada. Vamos a seguir adelante e imprimir el texto, Hola Mundo. Y luego voy a ir a Construir, construir artefactos y presionar Enter. Aquí vemos que está construyendo una vez más. Volviendo a la terminal, puedo presionar la flecha hacia arriba para ir al comando anterior. Si presiono Enter, ahora va a decir helloworld. El código real ahora se ejecuta a través de este archivo jar. 46. Introducción al proyecto de acorazados: Ahora vamos a estar sumergiéndonos en el proyecto final para el curso que va a estar haciendo un juego de Battleship para un solo jugador. Aquí vemos este tablero y tenemos cinco tipos diferentes de barcos, y todos están posicionados aleatoriamente alrededor del tablero. Podemos entonces entrar coordenada, por ejemplo, un 0, que en realidad está vacío como podemos ver aquí mismo. Y entonces dirá señorita. Pero puedo seleccionar H para esta coordenada aquí mismo. Y entonces dirá hit. Y esto ahora se reemplaza con una x. si lo hago yo, entonces j 0 es entonces va a decir, usa hundió su acorazado y toda esta nave aquí está hundida. Ahora, a diferencia de los videos anteriores en el curso donde escribimos código juntos, durante este proyecto, vamos a estar trabajando juntos en los planes para cada característica individual. Y luego quise intentar hacer esa característica por su cuenta. Ahora una vez que hayas completado esa función, o una vez que sientas que has hecho todo lo que puedas y aún necesitas ayuda adicional. Podrías entonces ir a la siguiente sección del video donde en realidad lo estaremos construyendo juntos. Pero te animo encarecidamente a probar cada parte individual de este proyecto solo antes ver el tutorial paso a paso. Así es como funcionan los desarrolladores de software reales. Por lo que es un gran hábito entrar en esa manera. Puedes construir una habilidad de resolución de problemas usando programación. 47. Archivos y coordenadas: Para iniciar el proyecto, eliminaría todos los archivos que tienes en tu proyecto como hogar seguro, el archivo que tiene tu función principal en la que estuve crea estos cinco archivos diferentes aquí. Y ten en cuenta ese archivo acorazado Maine. Esto contiene mi función principal justo aquí. Ahora hay muchas piezas dentro de ese proyecto que dependen unas de otras. Por ejemplo, si pongo el cursor sobre mi función principal aquí, estoy creando un objeto player, y estoy creando un objeto de tablero. Para hacer las cosas paso a paso, queremos empezar con la pieza más pequeña posible que no va a depender de nada más. Y también se va a utilizar y varios otros lugares en este proyecto aquí que va a ser una coordenada. Ahora mencioné que debes escribir todo tú mismo antes de seguir adelante. Pero este archivo es muy sencillo. Así que sólo voy a atropellar este archivo muy rápido contigo. Y en futuros videos con este proyecto, vas a querer probar las cosas por tu cuenta antes seguir paso a paso con mis propias explicaciones. Aquí tenemos una clase de acordes que significa coordenadas. Esto va a representar un valor x e y en el propio tablero. También va a tener una propiedad booleana, que va a representar si esto ha sido golpeado. Por lo tanto, lo que significa que si hay una nave ahí y en realidad adivinamos esa coordenada. Ahora, cuando creamos una coordenada, simplemente estamos pasando en x e y a través del constructor y la estamos asignando a las variables locales aquí. Entonces tenemos un getter y setter para las tres propiedades privadas, la x, la y, y la se golpea Boolean. Por lo que esencialmente somos capaces de conseguir la x, obtener la y, C Si se golpea esta coordenada, así como esos valores individuales. Ahora aquí tenemos una función toString. Siempre que imprimimos un objeto en la consola, en realidad va a ejecutar la función toString detrás de escena. Entonces esencialmente si fuéramos a imprimir una coordenada, va a imprimir x coma y Ahora, sólo por aclaración, si caso no sabes qué es un cuarto. Cada celda individual aquí va a ser su propia coordenada. Por ejemplo, esto tiene ser 0, este es uno, y así sucesivamente. Eventualmente vamos a crear nuestra propia junta aquí. Somos diferentes barcos se colocan al azar y las columnas del tablero se representan a partir de las letras a a través de J. Y las filas del tablero están representadas de los números 0 a nueve. Ahora este valor x e y va a representar dónde están dependiendo de las columnas y filas. Y el valor de la cadera va a representar si esto ha sido un golpe real. Entonces, por lo tanto, hemos adivinado dónde está un barco. Aquí tenemos un C5, por ejemplo, para esta celda justo aquí. Si digo C5, entonces va a cambiar a una x Entonces, esta coordenada y mi programa tiene el valor cambia a true. 48. Barcos: Ahora vamos a crear nuestra propia nave. Y antes de que realmente escribas cualquiera del código tú mismo, sugiero encarecidamente que en realidad revisemos el plan para esta clase y exactamente los consejos que he dado aquí. ¿ Qué es exactamente un barco? Bueno, obviamente dentro de nuestro programa aquí, si lo abro, esto va a representar una nave real donde aquí tenemos cuatro coordenadas diferentes. Y la situación tenemos cinco coordenadas diferentes. Este es un barco más pequeño, era sólo dos de ellos en total, cinco fichas diferentes. Entonces si miramos a esta clase, lo primero que vemos es una lista privada que va a contener una serie de coordenadas diferentes. Por supuesto, esta es la clase que escribimos en el último video. como vemos aquí mismo, cada barco requiere de su propia lista de coordenadas, por lo que sabemos exactamente dónde están. Ahora también vemos todos los tamaños posibles de barco aquí mismo. Y ten en cuenta que cada comentario que agrego, como este de aquí mismo, este bloque de comentarios de aquí mismo está diseñado para ayudarte tanto como sea posible y dar alguna información útil de lo que hay dentro de estas funciones. Pero aquí tenemos un método estático que devuelve una matriz entera. Esto es básicamente sólo va a devolver 54332. Y si voy a mi programa y lo vuelvo a ejecutar, aquí vemos un barco que tiene cinco largos. Aquí vemos un barco de cuatro largos, pero es sólo una vertical. Aquí vemos un demasiado largo un tres y luego otros tres. Entonces si tuviera que sumar en un barco de seis largos, y luego vuelvo a ejecutar ese programa. Ahora lo vemos aquí mismo. Esto va a determinar cuántas naves diferentes hay en los tamaños de cada barco. Por lo que ten en cuenta avanzar por defecto, tengo 54332. Ahora a continuación tenemos el constructor. Y debido a que esto solo tiene una línea larga, realmente no puedo ocultarte la funcionalidad, pero obviamente es muy simple. Sólo estamos recibiendo una lista de coordenadas y lo estamos asignando a la lista de coordenadas locales aquí mismo. Entonces también tenemos un getter tanto para las coordenadas la cantidad de coordenadas que tenemos. Básicamente obtener el tamaño va a obtener el tamaño de la nave ya que tipo de describe por el nombre. Lo que significa que aquí mismo, estos tres devolverán tres listas para volcar dos y así sucesivamente. Ahora estos probablemente se explican por sí mismos, pero los próximos pocos podrían no serlo. Y de nuevo, les animo mucho a echar un vistazo a los diferentes comentarios que añadí en. Por ejemplo, esto es GET index devuelve un entero y toma en un cuarto en él. Y si lo recuerdas correctamente, un índice es donde un determinado elemento está dentro una matriz o una lista comienza en 0. Aquí la descripción es, esto devuelve el índice en la lista de coordenadas donde se encontró el cordón de perineo. Esta es la coordenada perimetral y nos estamos refiriendo a la lista de coordenadas justo aquí arriba. Ahora desplazándose hacia abajo más, vemos que esto devuelve el índice de su presente o sus retornos uno negativo. Si no está presente. Si no puedes encontrar el índice, entonces quieres devolver uno negativo. Ahora a continuación aquí vamos a ver si esto ya está en uso. Aquí se comprueba para ver si una coordenada está dentro de la nave. Aquí hay una propina. Utilice el método de índice GET. Esencialmente get index debe devolver uno negativo si no está en uso o debería devolver algo más si no es de Estados Unidos. Y entonces aquí tenemos una función más complicada, que es verifica para ver si una coordenada dada sería un hit. Ahora la complejidad de esta función proviene de una, devolviendo una matriz booleana. Esta matriz va a contener dos valores diferentes. El primero va a ser un booleano, verdadero o falso si fue un hit. En el segundo va a ser un booleano, verdadero o falso si se hundió la nave. Entonces por ejemplo, si supongo algo y es una señorita, vamos a tener falso y falso. Aquí diremos mes es igual a falso y falso. Si es un golpe, pero no hunde el barco, habrá verdadero y falso. Si no hunde la nave, entonces va a ser verdad y verdad. Estos son los posibles valores de retorno cuando se trata de la funcionalidad. Esto tiene toda la funcionalidad que tiene un barco. Así que adelante y pausa este video e intenta agregar tanto como puedas, intenta llegar lo más lejos posible. Y una vez que hayas completado todo o has intentado lo mejor posible y realmente solo necesitas ayuda extra. Entonces adelante y reanuda el resto de este video y repasaré mi solución por cómo hice la nave. Muy bien, así que a partir de arriba, aquí tenemos un índice GET. Este es el primer método oculto que aún no repasé. Entonces repasemos lo que esto está tratando de hacer. Aquí. Tenemos una coordenadas de argumentos y estamos tratando de ver dónde está exactamente esto dentro de nuestra matriz de coordenadas, que se ha almacenado localmente en su clase en la parte superior aquí. Esencialmente devolverá índice o devolverá uno negativo si no puede encontrarlo. Por lo que vamos a empezar haciendo bucle a través de cada coordenada individual dentro de nuestra lista. Estamos diciendo int a es igual a 0, mientras que a es menor que el tamaño de la lista coronet, vamos a aumentar un estándar bastante for-loop. Dentro de aquí. Vamos a conseguir nuestro cuarto objetivo en ella. Y esto cambiará dependiendo cada iteración del bucle for. Mientras que entonces simplemente va a comprobar si el valor x es igual al valor x objetivo y el valor y es igual a un valor y objetivo. Si ambos son ciertos, entonces eso significa que esta es la misma coordenada exacta. Y queríamos volver al índice actual, básicamente simplemente devolviendo una Ahora si esta afirmación nunca es cierta, entonces eventualmente vamos a salir de todo este bucle. Y por lo tanto vamos a empezar sólo a devolver uno negativo, lo que significa que no pudimos encontrarlo. Esta sería la función de índice GET. Ahora pasemos a la función de uso final, que básicamente solo usa el método index. Aquí. Estamos creando un booleano llamado está en uso y asignación igual para obtener índice que pasa y coordenadas no es igual a una negativa. Tan negativo significa que no se encontró nada. Y si se encontró algo, eso significa algo entre 0 y el número total de coordenadas sería devuelto. Entonces básicamente, si el índice no es negativo, eso significa que son noticias. Ahora podemos realmente simplificar este código. Lo escribí en dos líneas separadas solo para poder minimizar esto, porque las funciones de una sola línea no se pueden minimizar como vemos aquí mismo. Si minimizo esta función, todavía vemos realmente el código. Así que volviendo a bajar para simplificar este código, simplemente puedo volver, obtener índice, pasar y coordinar no es igual a uno negativo. Esto devolverá verdadero o falso dependiendo si esta coordenada no se utiliza para la nave. Entonces aquí tenemos la función más complicada que se hizo hit. Y de nuevo, esto devuelve una matriz booleana donde va a ser el primer valor booleano si fue un hit y un segundo valor booleano va a ser si su piensa ese barco. Si expando esto aquí, primero vamos a obtener el índice de nuestro método GET index. Y si el índice es negativo, eso significa que esto fue una falta. Por lo tanto, una miss debe devolver una matriz booleana con false y false, como vemos aquí mismo. Aquí vemos este negativo, que va a ser el mismo exacto negativo que se devuelve si no podemos encontrar nada. Ahora, después de eso, una vez que llegamos a este código aquí, sabemos que realmente golpeamos algo. Ahora lo que dice, ver si realmente hundimos esa nave o si es sólo un golpe normal. En primer lugar, vamos a conseguir la coordenada en ese cierto índice y vamos a establecer su valor de cadera a verdadero. Si recuerdas en la clase coordinada aquí tenemos este hit booleano. Y entonces ahora estamos asignando esto a verdad porque realmente golpeamos esa parte de la nave. Ahora volviendo a la nave aquí, voy a crear un booleano llamado hundido y establecer esto igual a verdadero. Esencialmente lo que significa que por defecto vamos a asumir que la nave se hundió. Y luego aquí vamos a recorrer cada una de las coordenadas de la nave. Si no se golpea, entonces lo que se dice que se hundió es igual falso y vamos a salir de este bucle. Así que esencialmente, todo este código hace justo aquí. Es un asiento si el barco tiene alguna coordenadas que no sean golpeadas. Si cada coordenada de la nave es golpeada, entonces el barco se hundirá. Entonces finalmente, podemos devolver nuestra matriz booleana. En este punto del código aquí mismo, sabemos que hubo un golpe real. El primer booleano siempre es cierto, pero el segundo booleano va a ser verdadero o falso dependiendo de que realmente hundió la propiedad dependiendo de su lógica aquí mismo. Esta va a ser la función de golpe muerto. Y esta es probablemente la función más complicada en la clase de barco. Pero ojalá que toda esta explicación tuviera sentido para ti y ojalá tengas la mayor parte de esas funcionalidades abajo. Ahora, por supuesto, en la programación hay muchas, muchas formas diferentes de escribir este mismo tipo de código. Entonces si tu código logra algo parecido a lo que hace el mío, y si funciona, entonces no te preocupes, si se ve ligeramente diferente, eso está perfectamente bien siempre y cuando todavía haga lo mismo. 49. Jugador: Echemos un vistazo a la clase de jugadores. Esto es básicamente sólo va a manejar todas las naves para un jugador específico. Ahora en este proyecto sólo tenemos un jugador. Entonces básicamente, aquí es justo donde manejamos todos los barcos. Así que te mostraré algunas piezas de código básico de configuración. Pero cuando se trata de la funcionalidad real de cómo funciona todo, te animo encarecidamente a que intentes usar mis ejemplos aquí y seguir adelante y escribir la funcionalidad tú mismo, y luego ven volver al video. Uno te ha mostrado mis propios ejemplos. Para empezar, aquí tenemos una lista de barcos, la clase de barco, Eso es algo que hicimos en el video anterior. También tenemos aquí un constructor, que va a recibir el tamaño del tablero. Si vamos a mi expediente principal, aquí vemos estamos haciendo un nuevo jugador y estamos pasando en el tamaño del tablero. Ahora, volviendo atrás, también podemos devolver todos los barcos, sólo un captador muy simple. Ahora, avanzando aquí tenemos una función aleatoria. El objetivo de esto es asignar al azar un punto de partida para un barco dependiendo del tamaño del tablero y el tamaño del barco. También debe asegurarse que el barco pueda caber realmente en el tablero. Por ejemplo, aquí tenemos este bote de cinco largos. Y si este punto de partida fue, digamos J4, dónde realmente termina aquí. Entonces habrá cuatro personajes, habrá fuera del tablero. No podemos tener eso. Por lo que queremos asegurarnos de que en realidad podamos el barco en el tablero de Akron. Ahora esto devuelve un entero y la declaración de retorno dice la posición inicial para que el barco quepa en el tablero. Por ejemplo, si esta posición inicial fuera justo aquí, esto sería seis porque G es equivalente a seis, solo estoy mostrando letras aquí, por lo que es fácil distinguir si sus filas o columnas. Pero digamos que está empezando justo aquí. Esto sería seis y esto no encajaría toda la junta porque se trata de un barco de cinco largos. Tenemos diez columnas totales y diez filas. Seis más cinco equivale a 11. Entonces nos iríamos por uno. Va a devolver cinco en su lugar. Básicamente lo que significa que vamos a ajustarnos para ese cambio para asegurarnos de que la tabla pueda encajar en el barco. Ahora avanzando, Aquí, vamos a tener una guitarra coordenadas con una coordenada inicial y una coordenada final. Esto va a crear una lista de coordenadas desde un punto final inicial. Un ejemplo es un inicio de ceros 0 y un final de 03. Pero volvamos sería 00010 a la meta para esto es pasar en una coordenada inicial aquí y una coordenada final aquí. Y entonces devolverá todas las coordenadas necesarias para llenar toda la nave. Avanzando aquí tenemos está en uso o básicamente va a revisar una coordenada y ver si alguna nave va a estar realmente usando eso. Entonces aquí hemos colocado barcos, que en realidad es la función más complicada dentro de esta clase. Vamos a dirigir la nave, se pone tallas. Si voy por aquí y esto va a devolver una nueva matriz entera. En mi caso, tengo cinco tamaños de barco diferentes. Tengo un cinco largo, uh, por mucho tiempo. Dos instancias de un barco de tres niveles, y finalmente A2 barco largo con ellos jugador. Aquí voy a correr nave dot get tamaños para conseguir todos los barcos y asignar aleatoriamente si cada barco debe ser vertical o no. Si entro aquí a mi junta, vemos que cinco es horizontal. Pero estos tres de aquí mismo son verticales. Pero estos tres de aquí mismo son horizontales. Twitter va a asignar al azar un booleano vertical a cada barco individual que vamos a tratar de crear. También vamos a asignar al azar una coordenada inicial y añadir el tamaño del barco para obtener la coordenada final. Por ejemplo, aquí, esta coordenada ARN será de cinco para, pero vamos a sumar el tamaño del barco para obtener aquí la coordenada final. Esto va a ser 94. Ten en cuenta que a es básicamente 0, razón por la cual J es nueve. A continuación dice una mezcla que todas las coordenadas permiten que el barco encaje en el tablero y no están siendo utilizadas por otros barcos. Puedes usar métodos anteriores que hemos hecho en esta clase para eso. Básicamente asegurándose de que sea una coordenada única que realmente funcionará. Después, por último, añadir el barco resultante a la lista de barcos, que se declara aquí mismo en la parte superior. Ahora aquí hay una propina. Los valores de las coordenadas iniciales x e y deben ser aleatorizados. Entonces por ejemplo, esto de aquí mismo, esta coordenada 54, esta será generada aleatoriamente. Pero los valores finales de las coordenadas x e y, serán simplemente el tamaño del barco agregado a la coordenada inicial. Por ejemplo, aquí tenemos un barco de cinco largos. Entonces vamos a tomar esto y sumar cinco a ella. Obviamente contará que empezar uno como uno y no 0. Así que básicamente vamos a terminar con un señorío cinco. Además, solo debes agregar ya sea a la x o a la y, dependiendo de si es vertical o no. Nunca ambos. Entonces básicamente aquí, esto tiene una nave horizontal, lo que significa que sólo estamos agregando a la y Vemos que la x es cuatro. Todo el tiempo para toda esta nave son sólo los valores y que están cambiando. Por ejemplo, de f a j. Si tuviéramos que sumar a ambos, tendríamos aquí una rejilla de cinco por cinco con una plataforma gigante, pero queremos una representación real de un barco. Esto va a ser un poco más complicado, sobre todo en un lugar que funcionan los barcos que la última clase. Pero intenta hacer tantas de estas cosas como puedas. Y luego una vez que sientas que has ido tan lejos como puedas, o una vez que hayas terminado todo, sigue adelante y toca el resto de este video para que puedas echar un vistazo a lo que hice por las soluciones. Empecemos por la parte superior para la función aleatoria. Si expando esto aquí, voy a empezar haciendo un entero aleatorio. Con un valor máximo del tamaño del tablero. En este caso entre 09 porque el tamaño del tablero es de diez. Entonces voy a decir, mientras que el número aleatorio más el tamaño del barco es mayor que el tamaño del tablero, entonces voy a restar el número aleatorio. Así que echemos un vistazo a este barco de cinco largos aquí mismo. Si nuestro número aleatorio comenzó aquí mismo, que es de seis, ahora sabemos que seis más cinco, porque al azar seis botes heisst cinco en este caso, eso es mayor que el tamaño del tablero de diez. Vamos a seguir restándolo hasta que realmente encaja. En este caso, sólo estamos restando una vez, dándonos esta posición. Y luego vamos a devolver la nueva posición inicial. Esta es una solución con el fin de seleccionar al azar un punto de partida y asegurarse de que el punto de partida realmente funcione cuando se trata del tamaño del barco y el tamaño de la tabla. Ahora a continuación aquí tenemos conseguimos todas las coordenadas. Al inicio, vamos a hacer una lista de coordenadas, y también vamos a devolver esa lista al final. Entonces tenemos que mutar o modificar realmente esa lista de coordenadas para tener todos los valores que queremos. Ahora vamos a estar agregando a la x o la y, dependiendo si es vertical u horizontal. Aquí, primero estoy empezando revisando para ver si los valores x son los mismos entre el inicio y la coordenada y. Si echamos un vistazo al barco, por ejemplo, esto de aquí mismo, los valores x son siempre los mismos. Siempre son cuatro. Por lo tanto, esto tiene una embarcación horizontal. Entonces con eso dicho, necesito aumentar continuamente los valores y. Ahora aquí voy a conseguir el mínimo y el máximo valor y. Y vemos aquí mismo solo estoy usando Git. ¿ Por qué? Porque de nuevo, los valores x son siempre los mismos. Entonces voy a recorrer todos los valores y. Voy a añadir una nueva coordenada a la lista de coordenadas que hicimos aquí mismo. Voy a usar siempre el mismo valor x exacto, pero voy a pasar en el valor y de un for-loop. De esa manera la salida siempre lo mismo que debería ser para este barco, pero el valor y es el cambio de voz. Ahora en esta otra declaración, este es exactamente el mismo concepto, pero en lugar del valor y es para el valor x. Después de que cualquiera de estas se corrieran, luego va a devolver la lista de coordenadas. Avanzando, ahora tenemos aquí la función más fácil que va a pasar en una coordenada y ver si alguna de nuestras naves la va a estar utilizando. Así que básicamente estamos haciendo un bucle a través de todas las naves. Si no se usa, estamos volviendo verdad. De lo contrario vamos a devolver falso. Ahora, avanzando aquí tenemos la función más complicada, que es colocar todas las naves. Vamos a empezar haciendo un bucle a través de todas las posibles naves que queramos. Entonces vamos a asignar al azar un booleano si esto debe ser vertical o no. Entonces vamos a crear una lista de coordenadas, pero aún no vamos a asignarle nada. Ahora es posible que veas una palabra clave o escuchar que no estás demasiado familiarizado con. Por ejemplo, ¿qué es este colon principal o antes de este bucle while? ¿ Y qué estamos haciendo exactamente aquí? Básicamente porque tenemos nuestro bucle principal y tenemos un bucle dentro de él. Con este for-loop, necesito asegurarme de que etiquete cada bucle correctamente. Por ejemplo, si esto es cierto, quiero seguir en nuestro bucle while. Pero debido a que estoy dentro del for-loop, asumirá que estoy continuando en el propio for-loop. Con eso dicho, tengo que añadir una etiqueta al bucle while. Y luego puedo continuar en ese bucle mientras específico y no en el for-loop. Echemos un vistazo a lo que está haciendo el bucle for. En primer lugar, este es un bucle infinito, básicamente lo que significa que vamos a ejecutar continuamente todo este código hasta que finalmente lleguemos a esta declaración break aquí. Entonces, cuando empiezo, voy a conseguir este inicial x e y-valores. Entonces voy a usar esos para crear unas coordenadas iniciales. Entonces voy a conseguir las coordenadas finales, pero no voy a aleatorizar estas. En cambio voy a decir índice y fin y van a igualar al inicio x o y más el tamaño del barco. Si se trata de un barco vertical, vamos a tomar la x inicial, y eso es todo. Pero si no es un barco vertical, entonces vamos a tomar la x inicial y sumar por ambos lados. Entonces es el reverso para el final. ¿ Por qué? Si se trata de un barco vertical, vamos a tomar el y de partida y sumar por ambos lados. De lo contrario, solo vamos a usar un Y. inicial Y luego usaremos estos dos valores para crear una coordenada final. Entonces vamos a asignar un nuevo valor a esta lista de coordenadas justo aquí. Ese valor va a ser el resultado de las coordenadas de guitarra desde el principio y el final. Esto tomará las coordenadas de inicio y final y todo en el medio y las agregará a una lista. Y esta es la función que hicimos anteriormente. Ahora después voy a recorrer todas las nuevas coordenadas que acabamos de conseguir, y voy a asegurarme de que no estén en uso. Si no se usan, vamos a saltar de nuevo al inicio del bucle while y básicamente simplemente seguir intentándolo una y otra vez y otra vez hasta encuentres un montón de barcos que no se han usado antes. Ahora si todos los barcos nos encontramos con nuestra exclusiva, lo que significa que no se superponen unos sobre otros. En este for-loop sólo va a correr a través sí mismo y va a seguir adelante en esta declaración break. Ahora esta declaración break saldrá de todo este bucle while. Y luego aquí vamos a crear una nueva nave pasando por las coordenadas que acabamos de conseguir, y luego pasar toda la nave a la lista de barcos aquí mismo. Entonces esta es definitivamente una de las funciones más complicadas. No creo que ni siquiera cubramos estas etiquetas aquí, pero definitivamente hay otras soluciones que no requieren estas etiquetas que podría haber podido encontrar. Pero si no pudieras conseguir el lugar naves o cualquier otra cosa en la clase de jugadores. No te preocupes, el lugar naves funciona específicamente fue más complicado que mayoría de las cosas que hemos cubierto hasta ahora. 50. Terminar el juego: Este será el último video sobre el proyecto acorazado. Dentro de este video, vamos a crear nuestra clase de tablero y nuestra clase acorazado. Así que empecemos con la clase de apoyo, que estamos haciendo un sub de Nueva Inglaterra dentro de nuestra función principal. Y aquí estamos pasando en el tamaño del tablero así como el jugador que ya hemos creado. Ahora en la clase de junta, voy a repasar algunas funcionalidades básicas, y luego repasaré los conceptos detrás de estas diferentes funciones aquí. Para que puedas seguir adelante y tratar de hacerlas por tu cuenta. Y una vez que te quedes atascado o una vez completes la funcionalidad, entonces podrás ver cómo se ven mis soluciones. Así que a partir, tenemos un entero para el tamaño del tablero. Esto simplemente proviene del parámetro real. Entonces también tenemos una matriz de caracteres multidimensional. Esta va a ser la propia junta directiva. Por ejemplo, este es el índice 0, índice uno, índice 10, y así sucesivamente. Entonces tenemos una lista de letras que tiene todas las letras diferentes para los identificadores de columna. Entonces básicamente todas las letras que vemos justo aquí arriba. De esa manera no tenemos un 00 como coordenada o 10 como coordenada donde no está claro cuál es la columnas y cuál es las filas usando letras lo deja muy claro. Cual son las columnas y filas. Entonces tenemos acceso a un jugador aquí, que también solo estamos consiguiendo de los perímetros. Y así lo estamos asignando justo aquí. Primero estamos creando un tablero de juego, que vamos a echar un vistazo aquí en un momento. Y luego vamos a colocar los barcos para crear el tablero de juego. Esto va a llenar cada coordenada con el tablero con cierto carácter espacial. Entonces, por ejemplo, ceros índice de tablero, 0 equivale al espacio. Ahora por supuesto, no deberías asignar manualmente cada uno de estos. Esto debe hacerse a través de un for-loop. Ahora avanzando, aquí hemos colocado barcos. Esto va a bucle a través del jugador dot get naves. Y para revisar que realmente rápido, bajo consigue barcos aquí mismo. Esto simplemente devuelve una lista de todas las naves adjuntas a este jugador. Entonces vamos a conseguir todas las naves con un jugador, y luego vamos a conseguir las coordenadas de los barcos para obtener los valores x e y. Si entramos en la clase de barco, aquí vemos conseguimos coordenadas. Y esto simplemente devuelve una lista de todas las coordenadas asociadas a esa nave. Entonces vamos a asignar el tamaño de la nave como el personaje en el tablero X y bordo. ¿ Por qué? Por ejemplo, aquí este personaje de cinco largos, cada índice de tablero individual, por ejemplo , este, éste y así sucesivamente se llama cinco porque este es el barco de cinco largos por aquí. Este es el barco de cuatro largos. Aquí tenemos el barco de tres largos. Entonces los personajes van a ser lo grande que es ese barco. De esa manera queda muy claro dónde arranca y se detiene el barco. Y aquí hay una propina. Un entero contará como personaje, pero no de la manera que quieras. Es necesario convertir punto de nave get size en una cadena con valor de punto de cadena de y luego acceder al primer carácter de los resultados. El motivo de esto es porque cada personaje individual va a tener un número asociado a él cuando se trata de su valor ascii, que básicamente va a ser sólo una tabla de lo que cada carácter individual en su teclado representa en un valor numérico. Se puede seguir adelante y Google ascii valor o tabla ascii para obtener una mejor comprensión de lo que estoy hablando. Pero con esto dicho, debes asegurarte de que realmente estás convirtiendo el tamaño de la nave en el número real que deseas, porque por defecto no representará el número real. Pero básicamente esto significa que la nave dot get size va a devolver un número que no estás esperando. Y entonces necesitas convertirlo en una cadena primero con valor de punto de cadena de. Aquí vamos a conseguir un índice de letras. Y en realidad se puede ver esta función aquí porque solo tiene una línea de largo. Pero repasémoslo muy rápido. Aquí vamos a volver a América valor por cada letra en la matriz de letras. Entonces estamos pasando una cierta carta aquí. Y este es el alfabetismo podría ser índice de, y vamos a devolver el índice de esta carta del array de letras definiría que aparezcan un fraude. Por ejemplo, a sería 0, y así sucesivamente. Ahora a continuación vamos a intentar golpear ciertas coordenadas. Esto vería si una coordenada sería un golpe o no. Vamos a pasar en el valor x e y de la coordenada, y va a devolver una cadena. Si nos perdimos, devolverá el lío aquí mismo. Si golpeamos, volverá golpeado aquí mismo. Si es un golpe, eso hundiría un barco, en cambio volvería, hundiste su acorazado. Ahora, por fin aquí tenemos dos cuerdas. Siempre que estamos imprimiendo un objeto a la consola, se va a llamar a la función IF. Por lo que podemos anular este método para hacerlo. Entonces cada vez que estamos imprimiendo el tablero a la consola que vamos a imprimir exactamente lo que queremos, que va a ser el tablero completo, como vemos aquí mismo. Esto se imprime porque nuestra clase de barco pal, cada vez que estamos ejecutando el bucle de juego, vamos a imprimir el tablero real, pero lo cubriremos aquí en un momento. Esto va a recorrer todas las coordenadas del tablero e imprime los caracteres correctos donde deben estar. Y un consejo aquí es imprimir primero las etiquetas de columna, que son las letras, como se puede ver aquí mismo. Después imprime cada fila una a la vez, empezando por el número de fila, y luego cada coordenada para esa fila, vamos a simplemente imprimir el número de fila. Y luego vamos a pasar y sumar una cada coordenadas individuales. Y ten en cuenta que estas líneas de aquí mismo, también conocidas como tuberías, son presionando Mayús y presionando el botón de la Barra Inversa, que está justo encima de Entrar. Entonces tengo un espacio. Entonces tengo el contenido real para la coordenada individual, luego otro espacio seguido de más líneas. Entonces esta función aquí va a devolver una cadena que represente todo este tablero aquí mismo. Esta va a ser toda la clase de junta directiva. Adelante y trata de hacer tanto progreso en esto como sea posible, luego volver a ver mis soluciones. Y luego, repasaremos los conceptos detrás de la clase acorazado, que solo tiene dos funciones principales. Pero por ahora, repasa la funcionalidad de la junta y trata de hacer tanto como sea posible. Muy bien, así que ojalá pudieras agregar la funcionalidad para la clase de junta, o pudieras llegar lo más lejos posible. Repasemos ahora mi solución por cómo implementé estas funcionalidades. Entonces aquí tenemos crear gameboard. Si expando esto, vamos a recorrer cada matriz individual del tablero. Entonces cada fila individual va a ser una matriz anidada dentro la matriz multidimensional aquí mismo. Entonces voy a llenar toda esta fila con un espacio. Y si creaste un bucle anidado para seguir adelante y hacer esto, eso también está perfectamente bien. Como he mencionado antes, existen múltiples formas diferentes de resolver cada problema cuando se trata de desarrollo de software. Si escribiste este código, está bien. Si escribiste código similar al mismo, eso todavía funciona. Eso también está bien. A continuación vamos a mirar a los barcos del lugar. Si expando esto, vamos a recorrer cada barco que tenga el jugador. Entonces vamos a recorrer cada coordenada de esa nave. Vamos a sacar el valor x e y de esas coordenadas. Y entonces podemos asignar el índice de tablero XX y XY igual a esta expresión aquí mismo. Esto se remonta a lo que estaba mencionando de usar el tamaño del barco pasado a valor de punto de cadena de polvo porque estamos buscando un personaje específico y cada personaje individual tiene su propio valor entero. Debido a que se trata de una matriz de caracteres, no podemos simplemente asignarle un entero porque cada carácter individual en su teclado está representado por un entero específico. Y asumirá que ese va a ser realmente el caso. Por ejemplo, el carácter 0 representado por 48 numérico, el carácter uno representado por 49 numérico, y así sucesivamente. Lo que queremos hacer es asegurarnos de que realmente estuviéramos usando la cadena correcta. Vamos a tomar el tamaño del barco y pasarlo a una cuerda. Pero por supuesto, esto nos da una variable de cadena cuando queremos una variable de carácter. Así que simplemente podemos acceder al char en el índice 0, que solo hay un índice porque este solo tiene un valor de un solo dígito. Pero básicamente, esto convertirá el tamaño de la nave de cinco en el personaje cinco y luego asignará eso a la posición correcta del tablero aquí mismo. Por lo que esto pasará por todos los barcos y básicamente acaba de colocar los 5's donde está el barco de cinco largos. Los tres son, el barco de tres largos es y así sucesivamente. Ahora avanzando aquí tenemos obtener índice de letras que fue cubierto anteriormente en FSS sola línea de código. Hacia adelante otra vez, él, vamos a intentar golpear ciertas coordenadas. Así que primero vamos a crear una coordenada con el valor x e y. Y luego vamos a recorrer cada nave para este jugador exacto. Si recuerdas de la clase de barco, tenemos una función de hit por ir a eso. Aquí esto va a devolver una matriz booleana donde será el primer valor si fue un hit y el segundo valor va a ser si se hunde la nave, false. Falso significa que fue un desastre. Verdadero falso significa que fue un golpe, pero no hundió esa nave. Y cierto, cierto significa que sí golpeó y sí hundió esa nave. Entonces volviendo a mi junta aquí, voy a tener acceso a todos los datos de éxito. Y luego puedo crear dos booleanos separados. O sí golpeó es índice 0 y sumidero va a ser index1 con zinc fue a ver si es cierto. Si es así, vamos a X fuera esa coordenada específica. Entonces, por ejemplo, si ejecuto el programa aquí, puedo seleccionar B1 para representar esto aquí mismo. Puedo entrar B1 y cambia esos tres a una x porque eso fue un golpe real. Y también devuelve el hit de cadena justo aquí. Entonces para hacer eso, aquí, vamos a volver si un fregadero usando un operador ternario, vamos a devolvernos pensar que son acorazado, pero de lo contrario vamos a devolver hit. Y aquí es en realidad de donde viene la fuerza de la que vemos en nuestra consola aquí mismo. Ahora después de este for-loop, si nada realmente coincidía, eso significa que se perdió. Así que simplemente vamos a devolver la señorita de la cuerda. Avanzando aquí tenemos una función toString. Esto es básicamente sólo va a imprimir todo el tablero a la pantalla. Vamos a usar una clase StringBuilder. Y no hay nada de malo en usar una cadena normal y solo agregarla. Básicamente van a hacer lo mismo. Pero estoy usando un StringBuilder, que básicamente solo me permite agregar más cosas a la cadena de una manera más limpia. Pero detrás de escena es básicamente solo agregar a una cuerda. Aquí estoy empezando con estos espacios extra. Porque si voy a mi programa, eso es lo que vemos aquí mismo con nosotros texto resaltado. Estos son los espacios iniciales para asegurarse de que las etiquetas de columna estén alineadas con cada columna individual. Entonces me acredito algo conocido como delimitador, que se puede pensar como un separador. Y este será un espacio seguido de una tubería, seguida de otro espacio. Y eso es lo que vemos aquí mismo entre cada personaje individual para la coordenada exacta. Entonces voy a añadir un comentario. Voy a decir que esto va a estar sumando en las columnas. Así que voy a recorrer el tamaño del tablero porque las tablas son siempre un cuadrado perfecto. Puedo recorrer el tamaño del tablero dos veces diferentes. Uno para agregar las columnas, una para agregar las filas y el contenido individual. Aquí voy a anexar las letras dot get a, que comenzará en 0 y bucle a través de todo el tamaño del tablero, por lo que vemos esto aquí mismo. Ahora puedo recorrer todo esto. A continuación, vamos a anexar el delimitador a la cadena real, básicamente agregando en el espacio, la tubería y el espacio extra. Pero no queremos hacer esto cuando se trata del último elemento aquí, como vemos, j no tiene una línea extra al final del mismo. Para comprobar esto, podemos decir si a es menor que el tamaño del borde menos uno, si fuera a cambiar esto, y voy a correr esto una vez más, vamos a ver una línea extra en el borde de j. Lo cual realmente no me gusta, pero eso depende de ti si queremos tener eso. Entonces voy a cambiar esto de nuevo a lo que era. Ahora avanzando. Después de haber agregado en todas las columnas, vamos a agregar en una nueva línea usando el carácter de cuatro slash n escape. A partir de aquí. Entonces va a ir a la siguiente línea justo aquí abajo. Ahora aquí vamos a sumar en cada fila individual y el contenido real para el tablero. Entonces esencialmente vamos a tener un anidado for-loop, bucle a través de él, básicamente dos veces, uno para los valores x y otro para los valores y. Dentro de este anidado for-loop. Entonces vamos a tener a y B, que básicamente pueden representar x e y. hecho, para hacer las cosas más fáciles, voy a hacer clic cerca de a, y voy a presionar Shift y F6 y renombrar esto a x. Entonces voy a hacer lo mismo como ser turno y F6 y puedo cambiar esto a y Ahora esto nos deja más claro cuando estamos accediendo al tablero los valores son básicamente simplemente bucle a través de toda la x y y coordina los posibles valores. Ahora una cosa que quiero hacer es cuando y es 0, eso significa que estamos en el mismo comienzo aquí mismo. Y así queremos sumar en el número de fila, por ejemplo, 012 y así sucesivamente. Entonces vamos a sumar a eso de aquí mismo, y luego vamos a anexar el delimitador, que siendo un espacio, espacio de tubería, que vemos aquí mismo. Ahora después vamos a sumar cada personaje individual. Vamos a sumar en el tablero en el índice X e índice y Aquí está 00, aquí es 01, es 0, a aquí es 10, y así sucesivamente. Ahora, la mayoría de estos van a ser espacios, pero por supuesto, cuando se crearon los barcos, les colocaron caracteres aleatorios específicos con donde deberían estar realmente los barcos. Después, simplemente estamos añadiendo el delimitador de esa manera después de imprimir este espacio aquí, tendríamos otro espacio con una tubería y otro espacio para crear algún espacio en blanco para hacen que sea más fácil leer todo. Y después vamos a anexar una nueva línea. Esto va a lo que está tomando esta línea aquí y envolviéndola a la siguiente fila. Entonces al final de la función, vamos a devolver resultados en toString, básicamente simplemente devolviendo la cadena que acabamos de crear. Entonces esto es todo cuando se trata de la pizarra real e imprimiendo cosas. Si esto fue complicado para ti, no te preocupes, eso es completamente normal. Este proyecto aquí está asignado para tener algunos aspectos fáciles y algunos aspectos desafiantes. Si se queda atascado en estas partes, no te preocupes, esto perfectamente normal. Pero ahora que tenemos nuestra clase de junta creada, pasemos a nuestra clase de acorazado, y echemos un vistazo a las dos últimas funciones que necesitamos para que todo funcione. Entonces, hasta ahora hemos creado un jugador y creado un tablero. Y ahora vamos a correr, correr bucle de juego pasando en nuestro tablero. Existen dos funciones similares al resto de este proyecto. Voy a explicar los conceptos detrás él y luego podrás seguir adelante y ver qué puedes hacer con esos conceptos y luego revisar mi solución comparada con la tuya. Entonces aquí hay una descripción de cómo va a funcionar este bucle de juego. Vamos a crear un bucle infinito que hará seis cosas diferentes. El primero es dibujar el tablero de juego actual, básicamente simplemente imprimiendo este objeto de tablero a la pantalla porque creamos una función ToString aquí abajo. Siempre que imprimimos un objeto port, se va a ejecutar esta función. A continuación, vamos a imprimir la última acción. Entonces esto o fue una señorita, un golpe, o hundió su acorazado. En realidad vamos a querer crear esta cadena que se menciona aquí antes de nuestro bucle salvaje. Entonces vamos a pedirle al usuario unas coordenadas, o pueden ingresar la cadena quit. Como podemos ver aquí mismo en la parte inferior, ingrese coordenada. Aquí hay un ejemplo, o deja de jugar para dejar de jugar. Si entro a dejar de fumar, en realidad va a cerrar el programa. Básicamente reuniéndonos, vamos a volver de esta función. Observe que cuatro es lo que acabo de describir. Deja el juego. Si se ingresó el abandono, ese cinco. Ahora aquí es donde está la mayor parte de la lógica. El paso cinco es comprobar si se coordina es válida. Básicamente lo que significa que va a tener a los personajes individuales. El primero es una letra válida que forma parte de esta matriz aquí mismo. Y el segundo es un número válido entre 09 si alguno de ellos es falso o no es una cadena larga de caracteres, va a seguir pidiéndoles las coordenadas correctas. Por ejemplo, si ejecuto esto y entro o simplemente simplemente a, me va a preguntar de nuevo, si entro Z 0, va a preguntarme otra vez, si entro un 0, realmente va a funcionar. Tiene que ser una coordenada válida. Y esto es en realidad lo que vamos a hacer en esta próxima función aquí mismo. Pero describiré que una vez que lleguemos ahí, vamos a comprobar primero si una coordenada era válida. Si es así, vamos a intentar golpear esas coordenadas. Entonces vamos a almacenar la última cadena de acción para imprimirla después de que el tablero se muestre en la siguiente iteración de bucle. Por eso he mencionado aquí mismo. Básicamente vamos a tener una cadena antes de un bucle while, pero vamos a evaluar valor una vez que en realidad habíamos determinado si es una coordenada válida. Y después de haber tratado de golpear esa coordenada, de esa manera cuando volvamos al inicio, vamos a dibujar el tablero de mando actual. Vamos a imprimir la última acción. De esa manera el tablero de juego no lo cubre y luego vamos a seguir adelante después. Si la coordenada no es válida, entonces vamos a saltar de nuevo al paso tres, que está justo aquí. Pida al usuario una entrada de coordenadas o que ingrese quit. Esto de aquí mismo es lo que vamos a hacer para bucle una y otra vez y otra vez, si no entran una coordenada válida. Y aquí es donde se unen todas las partes del juego. Ahora, esta función aquí va a utilizar esta siguiente función que es coordenada válida. Vamos a pasar en una cadena, que será la entrada real del usuario. Cuando entro b5 aquí mismo, la cadena B5 se va a introducir dentro de este parámetro justo aquí. También vamos a tener una junta. Y si miramos aquí la descripción exacta, esto va a comprobar si la entrada del usuario es válida. Ahora hay dos requisitos. El primero es que debe ser una cadena larga de dos caracteres. El siguiente es que debe ser una carta. Es a través de J solamente, seguido de inmediato por un número que es de 0 a nueve solamente. Ahora aquí se recibe la entrada de punta y cadenas. Entonces conseguir un valor int del segundo personaje, que debería ser de 0 a nueve, no actuará como 0 a nueve. En cambio, va a actuar como si fueran valores de gráfico ascii, que mencioné anteriormente en este video. Esto significa que el carácter 0 equivaldría al entero 48 y el carácter uno equivaldría al entero 49, y así sucesivamente hasta que el carácter nueve sea igual al número entero 57. Para comprobar si la entrada de cadena del segundo carácter es de 0 a nueve. En realidad dijiste check para ver si es valor entero es mayor o igual a 48 y menor o igual a 57, básicamente lo que significa 0 es igual a 489 es igual a 57. Por lo que queremos estar dentro de estos dos valores aquí mismo. Adelante y escribe la funcionalidad para esto. Yo sugeriría comenzar con la función de coordenadas es válida porque se requiere para el bucle de juego. Y luego una vez que lo hayas hecho, adelante y trata de abordar el bucle de juego. Y luego podrás comparar tus soluciones con las mías. Empecemos con la coordenada es válida. Si expando esto, aquí primero vamos a ver si la longitud de la cadena no es igual a dos. Si eso es correcto, entonces vamos a devolver false porque esta tiene que ser una cadena larga de dos caracteres. Por ejemplo, si entro B5, que tiene tres caracteres de largo, entonces me va a preguntar de nuevo, si entré a prueba, que no tiene dos caracteres de largo. Va a volver a preguntarme, y seguirá preguntándole de nuevo hasta que entre a coordenadas válidas como J nueve. Ahora obviamente esto es un desastre, pero en realidad funcionó. Ahora después voy a crear una matriz de caracteres para separar las coordenadas exactas en los personajes individuales. Lo primero que hay que hacer con esa información es comprobar si la carta existe en realidad. Junta app.get Índice de cartas, como vemos aquí mismo, va a devolver el índice de todas nuestras letras aquí mismo. Significa que si no existe, va a devolver uno negativo. Esto básicamente se asegurará de que se usara a través de J. Ahora si no lo es, simplemente vamos a devolver falso. Pero si se usa, vamos a seguir y seguir adelante y revisar los siguientes valores, que estarán revisando del 0 al nueve. Aquí estamos creando un entero y una cadena es igual a un carácter. Recuerde, array es una matriz de caracteres, lo que significa que van a ser caracteres individuales que tienen números que los representan. Por ejemplo, el carácter 0, representado por entero 48. carácter uno está representado por el entero 49, y así sucesivamente. En realidad vamos a asegurarnos de que esto sea nueve al ver si el valor es mayor o igual a 48 aniones. Si el valor es menor o igual a 57. Si esta condición aquí es cierta, eso significa que todo es correcto cuando se trata de la entrada válida del usuario. Así que ahora desplábamos hacia arriba y hagamos la función muy final para todo este proyecto, que es run game loop. Tomaré toda la funcionalidad y armaré para que realmente sea utilizable. Si expando esto, vamos a empezar haciendo un escáner. Y vamos a crear una cadena, que se llama última acción. Y estamos asignando esto igual a nulo. Vamos a asignar esto más adelante. Esto será o el desorden o el hit, o Estados Unidos hundió su cuerda de acorazado. Y vamos a seguir adelante y hacer esto primero porque estamos deseando imprimir el tablero. Y luego inmediatamente después vamos a imprimir la última acción. De esa manera no se reemplaza automáticamente por la junta directiva. Por ejemplo, si fuera a imprimir esto antemano, una hora para ejecutarnos. Si entro un 0, por ejemplo, el tablero lo cubre. Si me desplazo hasta aquí, vemos el desorden. Entonces es por eso que necesitamos crear una cadena fuera del bucle while. Entonces no se va a restablecer cada vez, y entonces podemos imprimirlo si en realidad existe. A continuación, vamos a crear una cadena llamada coordenadas, y esto va a recibir la entrada del usuario. Aquí tenemos un bucle do-while, que si recuerdas, básicamente esto va a ejecutar este código exacto al menos una vez, pase lo que pase. Entonces después, continuará ejecutando este código siempre y cuando esta expresión aquí sea verdadera. Así que echemos un vistazo a lo que es este código dentro. Aquí estamos imprimiendo coordenadas internas, ejemplo un 0 o quit para dejar de jugar. Entonces vamos a conseguir la siguiente palabra que entra el usuario. Y vamos a convertir esto a mayúsculas. Entonces cualquier cosa como minúscula a 0 se convertiría en Israel mayúscula. Y esto hace que sea más fácil para nosotros comparar las cosas. Después, simplemente vamos a ver si se dejó la entrada. Si es así, vamos a volver de la función principal, que a su vez volvería aquí y luego simplemente salir del programa principal. Pero asumiendo que no entraron quit, entonces vamos a ver si es una coordenada válida. También vamos a usar un operador NO aquí mismo. Básicamente lo que significa si esta no es una coordenada válida con el cable terminado tablero dado, entonces vamos a seguir viviendo hasta que el usuario ingrese una coordenada válida. Pero si sí ingresan unas coordenadas válidas, vamos a seguir encendido y ejecutar todo este código aquí mismo, empezando por conseguir una matriz de caracteres. Y este es un concepto similar a lo que teníamos antes con la función de coordenadas es válida, vamos a conseguir una matriz de caracteres con índice 0 va a ser la letra e índice uno va a ser el número. Así que desplazándose hacia atrás aquí vamos a conseguir la columna que es board dot get Letter index, array index 0. Ahora conseguir el índice de esto básicamente va a convertir un a través de J en un 0 a nueve. El usuario ve una a través de J, pero el programa no utiliza realmente un a través de J. Utilizamos números diferentes para las columnas reales. Entonces a 0 a nueve. Y este es en realidad el índice de cada personaje individual. Si vamos a nuestra junta directiva, este tiene índice 0, índice uno, todo el camino hasta el índice nueve. Obtener el índice de esta lista nos va a dar la coordenada y correcta, por lo que nos da la columna. Ahora para la fila, simplemente vamos a tomar ese carácter exacto y vamos a restar 48 por las mismas razones exactas que vemos aquí abajo con todos los ejemplos de ascii. Básicamente carácter 0 equivale a 48. Entonces si restamos 48, eso significa que cualquier número que tengamos va a ser un entero válido. Está volviendo a subir aquí. El último accionar va a igualar tablero para intentar golpear, pasando en la fila y la columna. Y esto va a llamar a la función de golpe de intento, que luego pasaría y vería si un barco estaba realmente ahí. Y luego devolver una cuerda, dependiendo de si realmente golpeo o si se perdió o si un santo ese barco. Y así funciona todo este programa. Si ejecuto esto una vez más, ahora que vemos cómo funciona todo, ahora puedo entrar a B3, por ejemplo. Y se va a exceder. Si entro b2, que está por encima de él, va a decir señorita. Y puedo seguir entrando en B4, B5. Por último ser seis. Y ahora dice, ¿ crees que son acorazados? Porque todas las coordenadas están ahora x fuera para esa nave. Y ahora tenemos un juego de Battleship para un solo jugador completamente funcional, cual construimos juntos usando Java. 51. Conclusión: Esto concluye todo mi curso de Java para principiantes. Quiero agradecerles por tomar el curso. Y si queremos aprender más sobre desarrollo de software desde mis tutoriales, entonces checkout mi canal de YouTube, llaves desgastadas.