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.