Transcrições
1. Introdução: Java é uma das linguagens de
programação mais fáceis de aprender, tornando-a perfeita para iniciantes. Neste curso, vou
orientá-lo através programação e do
Java passo a passo. No final deste curso, você criará
programas reais usando Java. E você terá uma
sólida compreensão dos fundamentos
e fundamentos da programação. Programação de forno em
Java desde 2011. E eu até uso Java para criar minha própria
inicialização de servidores de jogos nisso e 14, eu fiz uma renda em tempo integral de seu projeto por alguns
anos antes de vendê-lo. Então, tenho muita experiência
usando Java e estou ansioso para
compartilhar meu conhecimento com você durante este curso.
2. Instalando o IntelliJ: Antes de aprendermos Java, precisamos de um lugar onde possamos realmente escrever e executar nosso código. Isso é conhecido como IDE, que significa Ambiente de
desenvolvimento integrado. Essa é uma
maneira super chique de dizer que é um editor de texto que também
converterá seu código em
um programa real. Agora, o
padrão do setor para IDEs e Java será
chamado de inteligência. Então você pode simplesmente fazer o download inteligente
do Google. Este é um software livre. Vá em frente e clique
no link superior aqui e certifique-se de
selecionar Community Edition. E eles também selecionam o
sistema operacional correto no qual você está. Estou no Windows, que
é o padrão. Então, vou ficar
aqui na guia Windows. Em seguida, posso clicar em Download. E seu download deve começar. E na maioria dos navegadores
que terão que
concordar que você
queria baixar esse arquivo. Depois de terminar o download, você pode clicar nele aqui. Aqui temos o instalador
real. Este é um instalador bastante
padrão. Bem, basta clicar em
Avançar cerca de 800 vezes e então você
deve estar pronto para ir. Eu só vou
passar e manter tudo aqui, o padrão. E então vou
prosseguir e pausar a gravação enquanto a
instalação estiver acontecendo. Depois de desinstalar, podemos seguir frente e clicar nesta
caixa de seleção aqui
e, finalmente,
clicar em Concluir. Depois de abri-lo, você
deve ser enviado para uma página semelhante a esta. Você vai querer
clicar em Novo projeto. Agora, nesta página, você
quer ter certeza selecionou Java na parte superior. Esse deve ser o padrão. E para o SDK do projeto, podemos seguir em frente e selecionar
qualquer que seja o padrão. Mas se você não vir um padrão, você pode baixar um JDK. Então, podemos clicar nisso e você pode selecionar a
versão desejada. Qualquer versão deve ser feita. Não vamos
fazer nada. Esse é um curso de processo muito
dependente da versão. Basta clicar no download. Agora, supondo que você
já tenha um SDK, podemos simplesmente clicar em
Avançar e depois novamente. E, finalmente, podemos dar um caminho para o nosso
projeto e um nome. Podemos clicar nos três
pontos aqui para navegar. Vou selecionar minha pasta
Java aqui e vou
criar uma nova pasta. Este será chamado de
espaço de trabalho. Aqui dentro. Vou
selecioná-lo e depois clicar em Ok. Agora, o nome do projeto por
padrão é espaço de trabalho. Tudo bem. Vou seguir em
frente e clicar em Concluir. Agora, o inteligente finalmente está aberto. À esquerda aqui
temos este projeto que podemos alternar clicando. Isso
mostrará todos os arquivos e pastas dentro do
nosso espaço de trabalho. Agora, em qualquer outro lugar neste painel gigante aqui é onde nosso código será mostrado. Mas não temos nenhum
código aberto agora. Mas agora que a inteligência
está instalada com sucesso, estamos prontos
para começar a escrever algum código com o próximo vídeo.
3. Olá.: Agora estamos prontos para finalmente trabalhar em nosso primeiro programa Java. E é uma prática comum simplesmente
imprimir o texto hello world na tela
como seu primeiro programa, não importa qual idioma ou aprendizado
continuará isso aqui, navegue até
a pasta de origem. E aqui precisamos criar uma
nova pasta dentro dela. Você pode clicar com o botão direito do mouse, ir para
Novo e selecionar pacote. Um pacote é basicamente
apenas uma pasta. E um programador Java
usa pacotes, uma maneira de organizar todos os seus arquivos
de código. Você pode ter vários arquivos de
código dentro de pacotes e você pode ter vários pacotes
em seu projeto. Por enquanto, vamos
trabalhar com um único pacote. Então vá em frente e clique com o botão esquerdo aqui. Agora precisamos inserir
um nome de pacote, e isso precisa ser único. Agora, uma prática comum é
usar um domínio invertido. Por exemplo,
com.google.com.YouTube. Mas, obviamente, esse não deve ser um dos domínios populares, mas sim seu próprio domínio. E se não possuímos um domínio, não se preocupe, você não precisa. Você pode
inserir tecnicamente o que quiser. Mas, por exemplo, para seguir com as convenções de
nomenclatura padrão, vamos fazer algo como com dot alex dot Flores ou outra
coisa assim. Obviamente, este tem o meu
nome e você pode usar seu próprio nome se quiser ou algo completamente inventado. Vou nomear esse pacote o domínio exato que eu possuo. Então, por exemplo, teclas desgastadas com
ponto. Agora, se eu pressionar Enter, veremos esta pasta foi
criada aqui. Agora, dentro daqui, posso
criar meu próprio arquivo, para que eu possa clicar com o botão direito do mouse,
ir para uma nova classe Java. E aqui temos algumas
opções diferentes. Vamos ficar
com uma classe padrão. Vou explicar a
diferença entre todos esses em vídeos futuros. O nome da classe que vou
chamar isso de Hello World com um H maiúsculo e um W
maiúsculo e sem espaços. É muito importante que nenhum
desses arquivos tenha
espaços em seus nomes. Depois de pressionar
Enter, você terá alguns pedaços de código
escritos aqui. Se você expandir essa pasta, agora verá o hello de
classe mundial aqui. Agora, os detalhes do que cada uma
dessas coisas faz serão
abordados em um vídeo futuro. Por enquanto, vamos
adicionar a esse código existente. Agora, se você clicar nesta
chave de abertura aqui, você pode pressionar Enter e você pode dizer que estamos
automaticamente com guias. E, uma vez agora, a tabulação é muito importante em qualquer
linguagem de programação porque
torna seu código muito
mais fácil de ler. E o benefício
disso se torna muito mais aparente depois de termos
arquivos muito maiores. Mas, por enquanto, não precisamos nos
preocupar com arquivos grandes. Nosso objetivo agora é apenas
imprimir o texto hello
world na tela. Agora vou escrever algum código. Vá em frente e acompanhe
comigo e faça esse curso. Vamos entender
o que cada parte desse código faz. Mas a maior parte disso não será
explicada agora. Para começar, posso dizer que
público, estático, vazio, principal e, em seguida, parênteses e parênteses finais devem ser gerados
automaticamente. E depois podemos colocar um espaço e, em seguida, uma cinta encaracolada, e semelhante aos
parênteses e
terminando a cinta encaracolada será
automaticamente gerada. Agora, entre as
duas chaves, se você pressionar Enter ou C, também
havia uma extremidade
com guias mais uma vez. Precisamos voltar aos parênteses e digitar string com um espaço S
maiúsculo. Em seguida, um suporte quadrado e um
suporte quadrado final serão adicionados. E então podemos digitar arcos. Agora acabamos de escrever muito código e a maior parte parece
muito confusa para você. Não se preocupe com isso. Contanto que seu código
se pareça com isso e não
haja linhas vermelhas em nenhum lugar,
então você está pronto para ir. E minhas linhas vermelhas rabugas, eu fiz algo assim. Aqui vemos esta
linha vermelha aqui. Isso é inteligência
para nos informar que há um
erro em nosso código. Nós passamos o mouse sobre ele.
Vai dizer que um
parêntese final como esperado. Então, posso adicionar um aqui
e, em seguida, esse erro desaparece. Novamente, se você estiver confuso
agora, não se preocupe, tudo será explicado à medida que continuarmos durante todo
o curso. O próximo passo será explicado
a ela agora, nosso objetivo é imprimir
algo no console. Podemos fazer isso digitando
sistema com um S maiúsculo, ponto out, ponto print LN. Podemos adicionar um parêntese e um parêntese final será adicionado
automaticamente. Dentro daqui, podemos adicionar aspas
duplas e semelhantes
a todo o resto, e finalizar
aspas duplas serão adicionadas. Agora temos um erro
no final aqui. Se eu passar o mouse sobre isso, vemos que um ponto e vírgula é esperado. Posso adicionar um e aqui,
semelhante a um ponto com
uma frase em inglês é ponto e vírgula termina uma declaração ou
uma frase Java. No final da maioria das linhas, você
adicionará um ponto e vírgula. E você deve ter notado
que não temos um ponto e vírgula aqui
na linha seis ou sete. O motivo disso
será explicado mais tarde. Mas geralmente, a maioria
das linhas de código que você
vai escrever deve ter
um ponto e vírgula no final. Agora, dentro dessas
aspas duplas aqui, podemos adicionar o
texto que quisermos. E enquanto
imprimimos no console, por exemplo, posso
adicionar no Helloworld. Então, a partir daqui, posso
ir para Executar na parte superior, porque depois clique
em Executar aqui. Como alternativa, você pode usar
um atalho exibido aqui. Temos esse pop-up aqui. Queríamos clicar
em Hello world. E agora vemos que
está construindo. Agora podemos
aparecer aqui. Vou ir em frente e baixar essa altura só para ter mais espaço para trabalhar com o código. Mas vemos o
texto Hello world, e que o processo terminou
com um código de saída 0. O 0 de um executivo
basicamente significa que tudo correu bem e não
houve problemas. Agora, se
quisermos, podemos adicionar diferentes
pontos de exclamação dentro da string. E em vez de passar por
todos esses suspensos aqui, podemos simplesmente clicar nesta seta verde
perto do canto superior direito. Ou você pode pressionar Shift mais
F2, o que você preferir. Se eu clicar nisso, agora
veremos que ele vai
reconstruir nosso projeto. E agora vemos o Hello World
com pontos de exclamação. Depois. Agora você concluiu seu
primeiro programa Java. Sei que muito desse código parece
muito confuso agora, mas tudo será explicado medida que avançarmos.
4. Comentários: Ao programar, não
podemos simplesmente escrever que
quisermos porque
este não é um código Java válido. E então, se eu passar o mouse sobre
eles, eles vão dizer
que
haverá erros relacionados
a esse código. Mas às vezes você pode
querer adicionar notas diferentes ou ser conhecido como
comentários em seu código. Isso ajudará você ou colegas entender
melhor o que está
acontecendo dentro do código. Por exemplo, posso fazer duas barras
para frente aqui
e, em seguida, posso dizer print
hello world para o console. Agora, neste exemplo exato, provavelmente não queremos
adicionar um comentário para essa linha porque a linha é bastante
autoexplicativa de qualquer maneira. Mas é assim que você adiciona
corretamente um comentário. Isso não teria nenhum efeito
no programa ou no que está
impresso no console. Está lá apenas como uma nota para outros programadores
e para você mesmo. Agora, à medida que
avançamos neste curso, você verá o
que deve ou não ter um
comentário anexado a ele. Novamente, uma linha como essa
é muito autoexplicativa, então não precisamos
adicionar nenhum comentário. Agora, alternativamente,
podemos adicionar comentários de
várias linhas
fazendo estrela de barra direta. E então uma
barra frontal final e inteligente realmente
faz o final para nós. Dentro daqui posso dizer que
isso é um comentário. Todo esse texto
aqui está acinzentado porque não é
tecnicamente código, mas sim um comentário.
5. Variáveis: Agora vamos falar
sobre, sem dúvida, um
dos conceitos mais importantes
quando se trata de programação. E esse é o
conceito de variáveis. Como você pensa em uma
variável como basicamente um contêiner que contém
algum tipo de valor. RAM ou a memória do seu computador é basicamente um monte de prateleiras
que guardam esses contêineres. Agora, cada contêiner terá um nome e o valor interno pode ser lido
ou alterado a qualquer momento. Então, por exemplo, vamos criar um número inteiro que é basicamente
apenas um número inteiro. Posso dizer int space. E agora temos que
nomear nossa variável. Isso deve ser
algo descritivo. Não devemos ter
variáveis nomeadas a ou X ou coisas assim que
não são muito descritivas. Então, neste caso, quero que isso
mantenha minha idade atual. Então, vou digitar a idade. Então, estou nomeando essa variável idade. Você pode nomear basicamente o que
quiser. Mas existem algumas regras que vou passar mais tarde
neste vídeo. Depois, vamos
adicionar um sinal de igual. E depois do sinal de igual, podemos adicionar qualquer número. Neste caso, será 28. E então, finalmente,
temos que adicionar em um ponto e vírgula o que
realmente está acontecendo aqui? Bem, o int
basicamente vai
dizer ao Java que queremos
criar uma variável, e isso vai conter
um tipo inteiro de valor. Existem diferentes
valores de variáveis que podem conter e os cobriremos
mais tarde no vídeo. Agora, toda variável
precisa de seu próprio nome. Nesse caso, damos
o nome da idade. Depois, temos
um sinal de igual, que é tecnicamente conhecido
como operador de atribuição. Isso levará o
valor à direita e o atribuirá à
variável à esquerda. E então, é claro,
temos a idade e você pode adicionar o
número que quiser aqui. Poderia ser 999, pode ser 0, pode ser menos 5 mil. Qualquer número inteiro funcionará. Mas por simplicidade,
vou acrescentar minha
idade atual, que é 28. Então, o que podemos realmente
fazer com essa variável? Bem, a
coisa mais básica que podemos fazer é provavelmente
imprimi-lo no console. Em vez de escrever a linha
system.out.print a cada vez, inteligência realmente nos
dá um atalho porque essa é uma linha bastante
longa de código para escrever. Então eu posso digitar S0
UT para saída do sistema. Se eu pressionar Enter, ele gerará automaticamente
essa linha de código para nós. Agora ele não gera aspas duplas e
isso é intencional. Se eu fosse adicionar
aspas duplas e depois a idade em que
executamos este programa, simplesmente
vemos a palavra
idade e nosso console. Mas isso não é o que queremos. Queremos ver o valor
dentro da variável idade. Temos que remover
essas aspas duplas, para que ele não exiba
o que é conhecido como string. Uma string é basicamente como uma frase ou uma
coleção de caracteres, algo que
compõe alguns textos reais. Agora, sem as aspas, ele tentará fazer referência ao valor dentro
da variável idade. Nesse caso, ele chegará ao contêiner
que
mencionei antes, e retirará o valor de 28 e depois enviará
para o cliente. Junte-nos de longe novamente. Agora devemos ver 28
no console como
fazemos aqui. Esse é um exemplo do que
podemos fazer com variáveis. Também podemos reatribuir um valor. Por exemplo, digamos que
eu tenha um aniversário, eu poderia dizer que a idade é igual a
29 com um ponto e vírgula. Observe como eu não uso
o int aqui. Quando faço isso,
há um erro. Se eu passar o mouse sobre
ele, diz que a idade variável
já foi definida. Então, basicamente, o int
só está lá quando estamos
criando a variável. Mas depois que ele é criado, ainda
podemos alterar esse valor reatribuindo
um valor assim. Agora, para provar isso, posso
imprimir isso no console. Então, OUT, eu poderia imprimir a idade. E se eu executar isso, agora
vemos 28 e também 29300. Portanto, um número inteiro é
apenas um número inteiro, mas existem vários
outros tipos de variáveis. Por exemplo, se eu
excluir tudo isso, agora
posso dizer que string com um nome S
maiúsculo é igual a Alex. E observe como sou rapidez
dentro de aspas duplas. Se eu dissesse Alex aqui, pensaria
que
estamos procurando uma variável com esse nome,
mas não há nenhuma. Então, para dizer ao Java que estamos
trabalhando com uma cadeia de caracteres, como uma frase ou uma mensagem, algum tipo de texto. Em seguida, vamos adicionar
aspas duplas. O Java não procurará
uma variável chamada Alex, mas trataremos
isso como uma sequência de texto. Agora, é claro que podemos colocar
isso no console. Posso imprimir o nome. E se eu executar isso,
veremos Alex no console. Mas existem muitos
outros tipos de variáveis. Por exemplo, temos um booleano. Booleano Jeff representa
um valor verdadeiro ou falso. Isso é tudo o que ele faz. Então, por exemplo, aqui, posso dizer que a programação é
igual a verdadeira. Agora true não está entre aspas porque
tecnicamente não é uma string. Verdadeiro ou falso, que é a única outra opção
para um booleano, são tecnicamente
palavras-chave em Java. Somos capazes de
escrevê-los dentro do nosso código. Por exemplo, se isso for verdade, agora
posso imprimir é programação. Agora, se eu executar isso,
veremos verdadeiro no console. É claro que, assim como números inteiros, podemos reatribuir estudos de valor. Então posso dizer que a
programação é igual a falsa. E se eu executar isso, agora
vamos ver False dentro do console. Agora vou
excluir esta linha aqui. E você pode notar como
eu nomeei a programação dele. Eu tenho um
I minúsculo e um
P. maiúsculo Dentro de nomes de variáveis, não
podemos ter espaços. Portanto, sempre que temos
várias palavras, é uma prática comum
usar algo conhecido como notação CamelCase. notação de caixa de camelo
é quando uma palavra é escrita com a
primeira letra maiúscula sendo minúscula em vez disso. Mas então cada palavra depois
disso tem uma
letra maiúscula no início. Isso facilita a
leitura sem espaços. Compare isso com a notação da caixa de
camelo. Obviamente, isso é
muito mais difícil de ler, especialmente para outras
pessoas que estão apenas lendo seu código
e não o escreveram. Então eles não sabem
exatamente o que é. Outras regras envolveram
que as variáveis não podem ter um nome
difícil para o número. Normalmente, você não deve
fazer isso de qualquer maneira, então isso não é muito descritivo. Mas se por algum motivo
você quiser, você pode adicioná-lo em um
sublinhado para começar. Em seguida, ele se torna um nome de variável
válido. À medida que avançamos
ao longo do curso, você verá mais exemplos de nomes de
variáveis para que possamos ter uma ideia melhor do que é
uma boa convenção de nomenclatura. Agora vamos passar para
outros tipos de variáveis. Em seguida, temos um char, que é semelhante a uma string, mas representa apenas
um único caractere. Por exemplo, posso
dizer que a letra é igual a a. E eles usam aspas simples, não
aspas duplas. Se eu fosse adicionar
vários personagens aqui, ele não vai gostar
e vai reclamar. Então, novamente, eles usam apenas
um único caractere. Também temos um duplo, que é semelhante a um número inteiro, mas é claro
que isso será qualquer número. Não precisa ser apenas um número inteiro. Por exemplo, a idade é igual a 28,5. Isso seria um duplo válido, mas estou usando o
mesmo nome de uma variável existente. Então, vou
dizer a idade como o dobro. Essa é outra
regra para nomear é que todo nome
tem que ser único. Caso contrário, não saberia qual variável você estava referenciando
exatamente.
6. Entrada do usuário: Até agora, acabamos de imprimir
coisas no console. Mas e se quiséssemos
receber informações dos usuários que estão
usando seu programa? Nesse caso,
seríamos apenas nós. Mas e se quisermos inserir certos números ou
nomes ou outras coisas assim e
tê-lo realmente
entendido dentro do
nosso programa DAW. Agora, para fazer
isso, serão
alguns conceitos. Haverá um pouco
confuso e
muito fora do escopo
deste vídeo aqui. Esses são conceitos que serão explicados mais tarde
no curso, mas são complicados demais
para explicar agora. Então vá em frente e
codifique comigo e esteja ciente de que isso
será explicado mais tarde. Então, vamos começar fazendo algo conhecido como scanner. Isso é o que é usado para receber
entrada dentro do nosso console. Então posso dizer scanner com um S
maiúsculo, pressiono Enter. Agora vamos
importar o scanner. Isso é algo que
vem incorporado ao Java, mas para
usá-lo dentro desse arquivo, temos que importar todo
esse código para esse arquivo. Isso é o que essa linha
aqui faz. Agora que criamos um scanner semelhante às variáveis que
analisamos no último vídeo. Temos que dar um nome a isso. Vou chamar essa entrada. Em seguida, podemos usar um operador de
atribuição ou um sinal de igual para atribuir
um novo valor a isso. Agora, isso será
algo que será explicado muito mais detalhes mais
adiante no curso. Mas, por enquanto, vá
em frente e codifique. Aqui. Vou dizer novo scanner espacial com um S maiúsculo e depois
parênteses depois. Agora recebo esse erro aqui. Quando eu passar o mouse sobre isso, ele diz que não é possível resolver o
construtor Scanner. Novamente, o conceito
de construtor e por que
esse erro está ocorrendo, ele será abordado
em um vídeo futuro. Mas, por enquanto, vamos
entrar entre parênteses, a
menos que
adicionem um sistema com um ponto S
maiúsculo n. Isso deve
se livrar do erro. Agora estamos prontos para
começar a receber a
entrada do console. Vamos começar com
uma string simples. Por exemplo, posso dizer que o
nome da string é igual ao ponto de entrada em seguida. E isso retornará
uma string por padrão. Em seguida, posso imprimir os
nomes do console. Então OUT e nome. E vamos garantir que o
usuário saiba o que fazer. Posso dizer S OUT, então posso entrar. Por favor, insira seu nome. Agora, se eu executar isso, veremos o
nome anterior, mas ele não
fecha imediatamente como dados e outras situações aqui estão realmente esperando que
digamos nosso nome. Nesse caso, adicionarei um Alex, e se eu pressionar enter, ele
imprimirá Alex. E aqui é onde diz que
um processo foi concluído. Os textos verdes serão os
textos que eu inseri e o texto em branco virá
de um programa Java em si. Agora, se eu executar isso novamente, adicionei meu nome completo. Por exemplo, Alexander
space Flores. Se eu executar isso, agora
vamos ver Alexander. Isso porque a próxima
função aqui contará cada caractere
até um determinado espaço em branco. Então, se houver um
espaço ou
uma guia ou uma nova linha e coisas
assim vão conseguir. Então, ele vai parar de procurar novos personagens e apenas
devolver o que ele encontrou até agora. Se quiséssemos
obter a linha completa, podemos dizer a próxima linha. Semelhante às variáveis, isso usará a notação CamelCase, o que significa que
temos um n minúsculo porque é a primeira
letra da primeira palavra. Mas a primeira letra
de todas as outras palavras. Por exemplo, L, será maiúscula. Se eu executar isso, agora posso digitar
meu nome completo com um espaço, então Alexander espaço para nós. E se eu pressionar Enter, veremos que a string completa foi
impressa de volta para nós. Agora não
precisamos apenas fazer cordas. Por exemplo, posso dizer,
por favor, insira sua idade. Então aqui posso dizer int
age é igual ao ponto de entrada em seguida. E aqui vemos várias
outras opções. Nesse caso, queremos next int porque esse é o nosso
tipo de variável, que é um int. Então eu posso usar o S0 UT. Eu poderia imprimir a idade
sem aspas. E se eu executar isso, ele
vai nos pedir a nossa idade. Nesse caso, vou inserir 28. Em seguida, imprimirá 28 de volta para nós.
7. De operadores aritméticos: Muitas vezes, quando temos números, não
queremos apenas
imprimi-los no console. Podemos querer adicionar, subtrair, multiplicar ou dividir
com esses números. Por exemplo, posso dizer
int number é igual a 50. Vamos prosseguir e
começar imprimindo isso
no console. Só sempre podemos
ver o que está acontecendo. Agora eu não vou
executar isso porque é muito óbvio
o que aconteceria. Mas digamos que queremos
adicionar um a esse número. Algumas
maneiras diferentes de fazer isso. Um exemplo será número
igual a número mais um. Agora, se eu executar isso, você provavelmente vai saber
o que vai ser impresso. Neste caso, será 51. Podemos adicionar dez ou 100 ou
qualquer outro tipo de valor. O que queremos para esse intruso. Agora, há uma
maneira mais curta de fazer isso. Então, vou usar a barra
de controle para seguir em frente e
comentar a linha atual. E então vou dizer
número mais igual a 100. Isso é basicamente
a
mesma coisa exata do que temos aqui, é apenas uma maneira mais curta de adicionar
um número a uma variável. Então, se eu executar isso, vamos
ver 150 no console. Podemos fazer o mesmo conceito exato quando se trata de subtração. Em vez de mais, tenho menos. E se eu executar isso,
veremos menos 50 no console. Claro que temos
multiplicação. Então, se eu executar isso, aqui vemos 5 mil
e divisão, que tem uma barra para frente. Se eu executar isso,
vamos ver 0. Agora o 0 aqui é porque estamos usando números inteiros que
são números inteiros. Se eu fosse mudar
isso int para um duplo, o que permite pontos decimais,
e eu fosse executar isso. Agora vemos 0,5. E, claro, todos
esses símbolos podem ser usados nessa sintaxe original. Por exemplo, podemos dizer
dividi-lo por 100 vezes 100. Qualquer coisa assim ainda
funcionará. Agora você pode estar se perguntando,
por que alguém que usa esse tipo de sintaxe se
isso for apenas mais curto? O principal motivo para usar
esse tipo de sintaxe aqui é porque se você
tiver várias variáveis, essa era a única
maneira de fazer as coisas. Por exemplo, posso dizer int
número dois é igual a dez. Então posso dizer que o número é igual ao
número duas vezes 100. Não podemos fazer isso com
esse tipo de sintaxe aqui, porque esse tipo de
sintaxe só
modificará a variável mencionada neste caso, que
será número. Agora vou excluir a maioria
das coisas e
vou criar outro
número inteiro chamado igual a cinco. Agora vamos dizer que queremos
adicionar ou subtrair uma dessa variável
com o que acabamos
de ver, poderíamos fazer número
mais igual a um. Se eu fiz isso, é claro
que é um tipo de trabalho. Nós veríamos seis no console. Mas aumentar e
diminuir um número por
um é tão comum que a maioria das linguagens de
programação, incluindo Java, tem
uma maneira de fazer isso, uma sintaxe ainda mais curta. Isso é conhecido como incremento
e decrementação de um valor. Então eu posso dizer número mais, mais. Se eu salvar isso, ainda
veremos seis no console. Isso aumentará
o número em um. Também poderíamos fazer o
número menos menos. Se eu executar isso,
veremos quatro
no console porque estamos subtraindo do número
original, que neste caso é cinco. Agora, as vantagens e desvantagens podem continuar atribuídas
à variável, e eles fazem coisas um pouco
diferentes. Nesse caso de uso, se
eu fosse executá-lo, não
veremos nenhuma mudança real. E ainda vamos
ver seis no console. Mas isso é apenas por causa de
como nosso código é escrito aqui. Ter as vantagens antes ou depois será muito mais
claro sobre a diferença. Se eu adicionar as vantagens diretamente
na variável aqui, se eu executar este pincel ainda verei seis no console. Isso porque as vantagens
antes do nome da variável, primeiro vão incrementar a
variável e depois usá-la. Usando, neste
caso, passamos para a função
de linha de impressão, basicamente
imprimindo-a no console. Mas se eu adicionasse
vantagens depois, isso significa que
primeiro vamos usar
a variável e
depois aumentá-la. Se eu fosse executar
isso, vamos ver cinco no console. Mas tecnicamente na
memória do nosso programa, o número ainda detém o valor seis. Simplesmente não o imprimimos. Para provar isso, posso
imprimir isso novamente. Confira nosso número de impressão. E se eu executar isso
, vamos ver 56. O mesmo conceito exato se aplica quando se trata de menos, menos. Se eu for executar isso,
vamos
ver cinco e depois quatro. Agora, é claro, se eu fizer
menos, menos antes
, vamos ver 44. Isso porque
estamos primeiro diminuindo o número e depois o usamos. Então, é claro que estamos apenas
imprimindo os resultados novamente. À medida que avançamos
para o curso, você verá várias
maneiras e
instâncias diferentes em
que isso será útil de usar. Especialmente quando
se trata de nosso primeiro projeto, que será por volta da
metade do curso.
8. Se Else: Agora estamos prestes a mergulhar em um conceito muito importante
conhecido como fluxo de controle. O fluxo de controle é basicamente
onde podemos
controlar o fluxo do
programa que teria adivinhado. E isso
geralmente é feito com algo conhecido
como declarações IF. Basicamente, se algo for
igual a algo, então vamos executar
um determinado código. Caso contrário, talvez não
pensemos em um jogo de
tiro favorito. Se você pressionar o botão Recarregar, ele verificará se você
tem uma Magdalena completa. Não, se você
não for entrar em recarga. Mas se você não tiver
uma revista completa, ela será recarregada. Vamos começar
criando alguma entrada do usuário, marcando criar um scanner. Vou chamar essa entrada. Vou atribuir o valor do novo scanner passando
no ponto do sistema n. Agora que temos acesso
a esse objeto de entrada, podemos realmente ler a
entrada do usuário. Então, vou dizer int number
é igual ao ponto de entrada next int. Agora vou simplesmente
imprimir isso para garantir que
tudo esteja funcionando. Tudo bem, Mike, e execute
isso com Shift e FTN. Aqui está esperando que
eu insira um número. Vou inserir 50 e, em
seguida, obteremos 50 impressos de volta. Tudo está funcionando bem. Mas em vez de apenas
imprimir o número, vou usar
uma declaração if. A sintaxe para uma instrução if
seria parêntese, e depois uma chave encaracolada e uma
chave final na próxima linha. Agora, dentro dos parênteses,
é onde nossa condição vai. E essa condição normalmente comparará as duas. Obrigado. Por exemplo, posso
dizer que o número dois sinais de igual, 52 sinais de igual é muito importante porque
um único sinal de igual, como mencionei antes, é
um operador de atribuição. Isso levará o
valor à direita e o atribuirá à
variável à esquerda. Mas dois sinais iguais
são uma comparação. Isso vai ver se
o valor à esquerda, ele chama o valor à direita. Vou adicionar um comentário
aqui que diz comparação. Agora, o que acontece se essas
duas coisas forem iguais? Bem, isso basicamente
se tornará uma expressão booleana. E se você se lembrar antes, um booleano é igual
a verdadeiro ou falso, não
há outros valores
de booleano pode usar instruções IF e
habitar condicionalmente como esta basicamente vai
procurar um booleano valor. Hipoteticamente,
deixe-me
comentar isso e deixe-me
entrar no número 50. Agora, neste caso, nosso editor de
texto
nos dá esse aviso amarelo
passando o mouse sobre ele. Ele diz que o número da condição
igual a 50 é sempre verdadeiro. Agora, obviamente esse é
o caso porque nosso valor aqui é 50
e isso nunca está mudando. Agora, a parte importante aqui
é que é sempre verdade, que é um valor booleano. Então, isso é basicamente a mesma
coisa que dizer se for verdade. Agora, se esse
for o caso, o código dentro dessas chaves sempre
será executado. Se isso fosse falso e o código dentro das chaves nunca
será executado. A condição dentro
dos parênteses deve ser uma condição verdadeira. Vou usar o Control Z para backspace até aqui onde estamos realmente
recebendo a entrada do usuário. E dentro daqui
vou simplesmente imprimir no console dizendo que
o número é 50. Agora vou me livrar de
alguns desses comentários aqui, só para tornar nosso código
um pouco mais limpo. Vou tentar
nos dirigir com Shift e F2. E aqui espera-se que
eu insira um número. Se eu digitar 50, vou
dizer os números 50. E se eu executar isso de novo, eu entro em qualquer outra coisa. Por exemplo, 99. Ele não vai imprimir nada porque essa condição é falsa. Portanto, o código
interno não será executado. Mas e se quiséssemos
verificar outros números? Will, em teoria, poderíamos apenas adicionar um monte de declarações if. Por exemplo, um número
exatamente igual a 51. Mas e se quisermos apenas uma coisa ser impressa
no console? Agora, toda vez que
criamos uma declaração if, isso
criará algo conhecido como cadeia de instruções if. Uma cadeia de declarações if. Isso conterá
até três
tipos diferentes de instruções. Temos nossas declarações if, temos nossas declarações else-if e temos nossas declarações
else-if. Vamos dar uma olhada nas declarações
else-if. Se eu me livrar dessa declaração
if aqui, eu poderia dizer o contrário, se o número for exatamente
igual a 51, posso imprimir
o número é 51. Agora, uma instrução else-if deve ser diretamente após
uma instrução if. Eles basicamente analisarão todas as declarações if e
else-if
anteriores. E se todos forem falsos, então ele irá em frente e tentará comparar
esses dois valores. Nesse caso, a
declaração IF online 16, vai comparar o número 50. Se isso for verdade,
vamos executar esse código. E então vamos
pular para baixo aqui. Na verdade, não vamos nem tentar comparar
o número de 251 porque a instrução else-if vê que a
declaração if era verdadeira. Ele vê que não faz sentido sequer verificar os dois valores. Mas se inserirmos um número
diferente, por exemplo 51, essa
condição agora é falsa. A instrução else-if, veremos que tentará
comparar esses dois valores. Nesse caso, os dois
valores são os mesmos. Então esse código executamos,
mas se eu digitar 52, nada aqui será rampa. Para provar isso, posso executar nosso
programa. Posso entrar 50. Aqui vemos os números
50, estrangeiros executam novamente. Posso inserir um 51, e aqui
vemos que o número é 51. Finalmente, posso
executá-lo e posso entrar 52 e nada acontece. Agora, para cada cadeia de instruções IF, por exemplo, isso aqui, podemos ter apenas
uma declaração if, mas quantas
declarações else-if quisermos. Por exemplo, posso dizer se o número for exatamente
igual a 52, eu poderia
imprimir o número é 52. E para tornar as coisas um
pouco mais interessantes, posso dizer que senão o número f
é exatamente igual a 52. Novamente, não consegui imprimir o teste apenas para garantir que essa declaração de impressão seja muito
diferente das outras. Então, se eu executar isso,
insiro 52 no console. Agora vemos que o número
é para os dois, mas não vemos texto. Isso porque essa
condição aqui era verdadeira. Portanto, essa afirmação
else-if não vai nem se
incomodar em comparar esses dois valores e
certamente não imprimirá nada
dentro das chaves. Agora, é claro, nosso IDE
está reclamando porque essas duas coisas
não devem estar aqui. Esta afirmação
aqui
nunca será executada, não importa o que aconteça. Porque se o número for 52, então esse código
aqui na linha 21, corremos em vez disso, porque nossa condição online
20 será verdadeira. Vou remover isso. E a última coisa que
eu queria mostrar a você é a declaração else. Isso tem que estar no
final de uma cadeia de instruções if. Isso é basicamente
apenas um pega-tudo. Se nada mais na cadeia de instruções
if fosse verdadeiro, por exemplo, posso imprimir um
número desconhecido e posso executar isso. E se eu entrar no 5352, sabemos o que vai acontecer. Mas o que acontece se eu entrar no 53? Ele diz
número desconhecido porque todas essas
três declarações if
aqui ou falsas,
portanto, a
declaração else que executamos. Mas se eu fosse executar isso
e quiser inserir 52, então ele diz que o
número é para os dois. E a declaração else
não é executada porque vê ou uma das afirmações f ou
else-if anteriores era verdadeira. Basicamente, o programa vai passar por tudo isso e tentar encontrar as
primeiras afirmações verdadeiras e ignorar todo o resto.
9. Declarações “switch”: No último vídeo, demos
uma olhada nas instruções if, mas esse é apenas um
exemplo de fluxo de controle. Outro exemplo será algo conhecido como uma instrução switch. Agora, isso é menos
usado como instruções se, mas você verá isso
de tempos em tempos. Por isso, é importante
entender como funciona. Posso simplesmente dizer
trocar parênteses e depois de
chaves curly. Agora, os parênteses
de anticorpos serão um valor, não necessariamente uma condição, mas qualquer tipo de valor. Por exemplo,
neste caso, um número. Agora, dentro,
basicamente
teremos algo conhecido
como declarações de caso, que são
como declarações if. Posso dizer caso 50 com dois pontos. Se eu pressionar Enter, eu poderia
adicionar o número é 50. Então eu tenho que adicionar algo conhecido como
uma declaração de break. Vou seguir em frente e
executar isso com Shift F2. Dentro daqui, posso
inserir o número 50,
ou seja, os números 50. Agora, se eu executar isso de novo, eu entro em qualquer outra coisa.
Por exemplo, 51. Nada realmente
vai acontecer porque obviamente, não estamos
lidando com 51 em nenhum lugar. Isso é
diferente de uma declaração if e tinha seus próprios casos de uso. Na verdade, é mais
comumente usado para minha experiência ao
comparar strings, mas você pode usá-lo em vez de declarações
if, se
realmente quiséssemos. Mas há mais nisso. Por exemplo, posso
adicionar em mais casos. Então, caso 51, eu posso adicionar. O número é 51
e eu posso quebrar. Agora, é claro, se
eu executar isso e adicionar 51, ele apenas dirá isso. Mas o que acontece se eu quiser verificar dois números diferentes? Bem, também posso dizer caso de 52. E então a
declaração de impressão dirá que o número é 51 ou 52. Agora, se eu executar isso, posso
ir em frente e entrar em 52. Diz que o número é 51 ou 52. É claro que obteremos
a mesma saída se eu inserir o número para um. Agora, a capacidade de verificar dois valores
diferentes com uma instrução
if
será explicada em alguns vídeos no curso. É muito mais fácil explicar
isso com instruções switch. Então é por isso que estou
cobrindo isso aqui. Uma coisa a ter
em mente, basicamente, se algum dos
casos for verdadeiro, o código continuará a ser executado
até que uma
instrução break seja encontrada. Por exemplo, posso alterar
isso para o número é 52. Então posso imprimir o
número é 51 aqui. Observe como não temos uma declaração de break após esta declaração de
impressão aqui. Este aqui é o
único quebra ele quando
temos quatrocentos e cinquenta e
um e cinquenta e dois. Então, se eu executar isso
e herdar 51, o que vai acontecer
é que ele continuará a executar o código até
encontrar uma instrução break. Vemos que o número é 51. Não se importa se
há um caso aqui. Só vai ignorar isso. E vai rodar
esta linha aqui, o número para os dois, e
depois vamos quebrar. Agora, uma última coisa
para instruções
switch será padrão, o que é algo que
normalmente acontece no final. E isso é como
a declaração else
para declarações if. Aqui posso
imprimir um número desconhecido. E, tecnicamente, você não
precisa de uma declaração de break mesmo que muita coisa
argumente que é uma sintaxe adequada. Mas o código funciona bem mesmo sem uma instrução break,
pois, é claro, o padrão deve ser
o último caso que sua verificação dentro
da instrução switch. Se eu for em frente e executar isso
e inserir qualquer outro número, por exemplo, menos 500. Em seguida, vemos um número desconhecido. As instruções switch são
bastante simples e
podem ser usadas em vez de
instruções if e alguns casos de uso. Mas normalmente você usará declarações if.
10. Operadores de comparação: Agora vamos voltar
para as instruções if e dar uma olhada nos operadores de comparação. Essas são maneiras diferentes de
comparar dois valores. Anteriormente, tínhamos que
olhar para o sinal de igual duplo, que simplesmente
verificaria
o valor à esquerda e compará-lo com
o valor à direita. Mas há muitos outros
operadores que podemos usar em Java ou praticamente
qualquer linguagem de programação. Por exemplo, temos
um sinal maior que. Havia menos que sinal. Temos maior ou igual a e temos
menos ou igual a. E também temos um não igual a. Agora, a maioria deles é
muito autoexplicativa. Mas vamos dar uma
olhada em alguns exemplos. Como eu disse, se o número não
for igual a 50, posso então imprimir
o número dele não 50. E se eu executar isso
e entrar 50, claro que não veremos nada porque o
número é igual a 50. Portanto, essa condição
aqui é falsa. Mas se eu executar isso
novamente e eu inserir qualquer outra coisa, Por exemplo, um, vemos que o número
não é 50 porque, claro, um é a mesma coisa que 50. Agora vamos tentar outras coisas. Por exemplo, posso dizer que o
número é maior que 50. Também posso que o número
seja maior que 50. E se eu executar isso, agora posso inserir o número que eu
quiser, por exemplo, 900. E dirá que o
número é maior que 50. Mas se eu inserir algo
menor ou igual a 50, então nada vai acontecer. O igual à parte é importante porque 50 não é
maior que 50. É igual a ele. Se eu entrar 50, nada
será impresso. Se eu quisesse essa funcionalidade, posso dizer
maior ou igual a 50. Se eu executar isso e eu
inserir 50, é claro, agora
vamos ver que o
número é maior que 50. Mas isso é só porque eu
não atualizei esse texto. Mas a parte importante
aqui é que o número agora
é
maior ou igual a 50. E, claro,
quanto menos operadores de sinais funcionarão exatamente da mesma maneira. Tenho certeza que você pode
imaginar como eles
funcionarão e podemos
usá-los para ter expressões
mais complicadas dentro de nossas
declarações if para ter programas mais complexos e mais
significativos.
11. Operador lógico: Vamos dar uma olhada nos operadores
lógicos. Essas são outras maneiras de adicionar verificações
mais complicadas
em nossas declarações if. Então, alguns exemplos disso
serão o operador NOT. Este também será o operador AND
lógico. E o operador OR lógico, que é pressionando Shift e pressionando a tecla acima, enter. O operador NOT basicamente reverterá um valor. O operador AND
basicamente garantirá que essa coisa à esquerda e as coisas à
direita sejam verdadeiras. O operador ou
garantirá que essa coisa
à esquerda ou à
direita ou ambas sejam verdadeiras. Vamos dar uma olhada em tudo
isso com exemplos. Posso dizer que se
o número exatamente igual a 50, número é exatamente igual a 55, posso imprimir 50 ou 55. E se eu executar isso, agora
posso entrar 50 e vemos 50 ou 55
rodando isso novamente, entrando em 55, vemos
a mesma coisa. E, claro, se eu executar isso
e entrar em qualquer outra coisa, por exemplo, 70, não
veremos nada no console. Basicamente, isso quer ver que o lado esquerdo
do operador ou, ou o lado direito, ou ambos são verdadeiros. E isso pode ser óbvio
porque esse é o operador OR lógico. Deixe-me ir
em frente e adicionar o que eles representam. O
operador OR lógico será esse ou aquilo, qualquer um. Agora, o operador AND
fará muito sentido
nesse caso de uso, porque a
variável numérica não pode conter um 5055 ao mesmo tempo. melhor exemplo
do operador AND é quando se usa
maior que e menor que. Então, por exemplo, eu poderia dizer número é
maior ou igual a 50 e o número é
menor ou igual a 55. Portanto, qualquer coisa de 50 a
55 deve ser incluída. Vou mudar
isso para 5255. E se eu executar isso, agora
posso digitar 52. E vemos que isso é verdade. Essencialmente, se o número
for maior ou 50 e o número for menor que ou 55 do que a
instrução if inteira será verdadeira. Se qualquer uma dessas duas
expressões for falsa, a instrução if
será falsa. Por exemplo, se eu executar isso mais
uma vez e eu entrar 56, nada vai
realmente acontecer. Embora esta parte
aqui seja verdadeira, porque 56 é
maior ou igual a 50. É falso aqui, porque para os seis não é
menor ou igual a 55. E o operador e exige que tanto a esquerda quanto a
direita sejam verdadeiras. Agora vamos dar uma
olhada em um operador NOT, que basicamente
irá reverter uma expressão booleana
com declarações if, podemos realmente emparelhar certas
condições. Por exemplo, posso envolver parênteses em torno
dessa coisa toda. E se eu fosse executar isso,
a mesma coisa aconteceria. Mas agora podemos usar um
operador NOT ou de antemão. Toda essa expressão
será
verdadeira ou falsa, dependendo se o valor do número é o operador NOT simplesmente
reverterá isso. Então, vou dizer que não 5255. Se eu executar isso, eu
poderia entrar 52. Nada acontece. Mas se eu executar isso
novamente e eu inserir qualquer coisa que
não esteja entre 5055, por exemplo, todos os 34, não
vemos 5255. O operador NOT simplesmente reverterá uma expressão
booleana. E ao longo do
curso
veremos mais casos de uso
do operador não e dos
outros dois operadores também. E quão úteis eles podem ser.
12. Enquanto loops: Agora vamos
ver o exemplo mais simples de um loop. E essa é uma maneira de fazer com que
certos pedaços de código continuem a ser executados de novo e novo, desde
que quisermos que eles sejam executados. Portanto, existem alguns tipos
diferentes de loops. Mas neste vídeo
vamos dar
uma olhada no loop while. Então podemos dizer Enquanto parênteses
e, em seguida, chaves encaracoladas. E dentro dessa condição haverá uma expressão
booleana. Isso
será verdadeiro ou falso se esse loop
continuar sendo executado. Por exemplo, posso
criar um número inteiro chamado contador e
definir isso igual a 0. Eu poderia dizer, enquanto o
contador é menor que dez, eu posso então entrar no loop while e
tudo dentro dos aparelhos encaracolados será executado
desde que essa condição
aqui seja verdadeira. Agora, atualmente, isso
seria conhecido como um loop infinito porque o
contador nunca está mudando. É sempre 0. Então o balcão de
elevação e a lata são sempre verdadeiros. Queremos ter certeza de
que realmente
mudamos o estado do contador, onde ser dez ou
maior é uma possibilidade. Dessa forma, não ficamos
presos em um sono para sempre. Faça isso. Vou primeiro imprimir o que é o
contador, como. Eu digo balcão, espaço de dois pontos. E então, fora da corda, eu poderia fazer mais contador. Isso adicionará o conteúdo da variável contador
na string geral que foi passada para a função de linha de
impressão. Agora depois posso
dizer contador plus plus. Ou se eu realmente quisesse, eu poderia colocar isso aqui. Como aprendemos antes,
colocar o mais, mais à esquerda do nome
da variável
primeiro aumentará e, em seguida, você o usará. Usando, neste caso, nós o
imprimimos no console. Então, antes de executar isso,
vamos rever o que acabei de fazer. Eu criei uma
variável inteira com um valor de 0. E estamos dizendo que, embora essa
variável seja menor que dez, vamos executar todo o código dentro dessas chaves. Agora, esse código
simplesmente imprime o contador. Mas antes de realmente
imprimirmos o contador, vamos
aumentá-lo em um. Isso significa que nosso
loop não é mais infinito porque eles são executados
pela primeira vez, ele imprimirá um, depois dois, depois três, e assim por diante
até chegar a dez, onde o contador menor que o estanho não
seria mais verdadeiro. Então, podemos sair do nosso loop e continuar com
o resto do nosso programa. Vamos ver isso em
ação. Posso fazer Shift F2. Ele deve executar nosso programa. E se eu expandir esta janela, agora
vemos o contador um
todo o caminho até dez. Este é um
exemplo muito simples de um loop. Basicamente, embora isso seja verdade, vamos executar todo o código dentro das chaves.
13. Faça enquanto loops: Vamos agora dar uma
olhada no loop do while. Isso é semelhante
ao loop while, mas é um pouco
menos usado. A sintaxe conosco será
devida, depois chaves curly. E então, no final do suporte
encaracolado, diríamos enquanto com nossos parênteses
e um ponto-e-vírgula. Agora, a condição será colocada dentro disso aqui. Basicamente, o conceito
aqui é que vamos
executar esse bloco de código
imediatamente, não importa o que aconteça. Então, depois, basicamente se tornará
um loop while normal. Vamos continuar a
executar esse bloco de código enquanto essa
condição for verdadeira. Mas não importa o bloco
de código que executamos pelo menos uma vez, isso é
diferente de um loop while, onde esse código de gancho de bloco
só é executado mesmo na primeira vez, somente se a condição for verdadeira. Agora, um
caso de uso prático para isso é receber a entrada do usuário e garantir que obtenhamos
o tipo correto de entrada ou um número correto. Por exemplo, posso dizer que a
entrada do scanner é igual a um novo scanner. Eu posso passar no sistema ponto n. E então aqui
vou dizer int number. Não vou
atribuir um valor a ele. E isso é algo que
podemos fazer com variáveis. Podemos criá-los, mas você não precisa atribuir
um valor a eles imediatamente. Agora, dentro do bloco
do código aqui, vou dizer que o número
é igual ao ponto de entrada next int. Então vou dizer que enquanto o
número for menor que dez. Então, essencialmente, o que esse
código vai fazer é primeiro receber
algumas informações do usuário. Vamos criar um número que usaremos
mais tarde. E então vamos
executar esse código. Não importa qual seja a condição
de
caminhada , ela sempre funciona uma vez. Então, essencialmente,
vamos receber informações do usuário,
idealmente um número. E então vamos continuar
a executar isso, desde que essa
condição aqui seja verdadeira. Portanto, temos que fornecer
um número que seja dez ou mais para que ele
realmente receba uma entrada válida. Agora, depois vou
imprimir o número. Vou executar isso
com shift e FTN. Agora, dentro daqui, posso
entrar o que quiser. Por exemplo, cinco ou sete. Qualquer coisa menor que dez será completamente ignorada porque
o loop while
continuará a fazer com que esse
bloco de código aqui executado várias vezes até que
essa condição seja falsa. Posso até inserir
menos 5 mil, por exemplo, e ainda
continuará funcionando. Mas assim que eu inserir qualquer coisa dez ou maior, por exemplo ,
84, ele vai
sair desse loop, e vai
imprimir 84 aqui.
14. Para loops: Vamos dar uma olhada
no loop mais poderoso
, conhecido como for-loop. Essa é a melhor
maneira de contar coisas ou iterar sobre uma lista
de certos elementos. Isso pode parecer confuso, mas ao longo do curso você
verá exemplos disso. Por enquanto, vamos simplesmente
tentar contar algo. No exemplo anterior,
criei um contador e em seguida, ele usou um loop while para ir em frente e contar sobre isso. Podemos usar um loop for-loop para conseguir isso e de uma maneira
muito mais limpa. Por exemplo, posso dizer para
parênteses, aparelhos encaracolados. E dentro dos parênteses
haverá
três
elementos diferentes que serão três
elementos diferentes que separados
por ponto e vírgula. O primeiro
será a inicialização. É aqui que
podemos realmente criar variáveis que podem ser
usadas com nosso loop. Então posso dizer que int
counter é igual a 0. O segundo será uma condição
semelhante
a um loop while
ou “do-while”. Isso acontecerá se o loop continuar a
ser executado. Neste caso, vou
dizer contra menos de dez. Depois, esta última seção será um código que executamos toda vez que
o loop for concluído. Nesse caso, queremos
dizer mais contador plus. Então, cada vez vamos
aumentar o contador em um. Agora, dentro daqui,
vou simplesmente imprimir o contador
no console. E se eu executar isso
com shift e F2, veremos uma contagem
de 0 a nove, como vemos aqui. Ainda no loop. Primeiro começa, ele cria essa
variável apenas uma vez. Em seguida, assenta se essa
condição for verdadeira, em caso afirmativo, ela não executa todo o código
dentro de nossas chaves aqui, basta imprimir 0 no
console como vemos lá. Então, quando chegar ao fim, percebe que
não há mais nada a fazer. Então, ele vai para trás. Como está fazendo isso
aumenta o contador aqui. Essa gnose, esse contador agora
é 11 é menor que dez. Tão fofo repetindo o processo até que essa condição seja falsa, o que vemos aqui. Porque uma vez que são nove
e aumenta para dez, a condição não é mais verdadeira. Portanto,
saímos do loop.
15. Quebre e Continue: Vamos dar uma
olhada no intervalo e
nas palavras-chave continue com como analisar a quebra
dentro das instruções switch. E funciona de forma
semelhante aqui. Mas essas são duas
palavras-chave que podem ser usadas em qualquer um
dos tipos de loop. Por exemplo, posso dizer
int counter é igual a 0, enquanto o contador é menor que dez. Agora aqui, primeiro
vou aumentar o contador e depois vou
imprimi-lo no console. Mas digamos que eu
fui pular o número cinco depois de aumentá-lo. Mas antes de imprimir no
console, como eu disse, se o contador for exatamente
igual a cinco, agora
posso continuar e
continuar ou basicamente simplesmente pular todo o resto em um loop e apenas voltar
ao início do o loop. Ele ainda verificará
a condição. Mas tudo passou por esta declaração
contínua aqui, bem, basicamente ser ignorado neste
caso é apenas esta linha aqui. Essencialmente, uma vez que
atingirmos isso, vamos
saltar de volta para o início e eles continuam fazendo
loop normalmente a partir daí, vou pressionar Shift
e F2 para executar o código. E aqui vemos de um a dez, mas cinco estão faltando. Vemos 46 imediatamente
depois. Essa é a palavra-chave continue. Ele
voltará automaticamente para o início do loop. Agora vamos dar uma
olhada na palavra-chave break. Alguns de vocês já podem adivinhar
o que isso vai fazer. Essencialmente, em vez de apenas
saltar de volta para o início, se ele vai
sair completamente do loop. Se eu executar isso, veremos um a quatro porque
uma vez que cinco forem
atingidos, ele imediatamente quebrará
e começará a
executar o código fora
do loop while. Você pode usar essas duas
palavras-chave para ter melhor controle sobre seus loops e o que é executado e quando
sair deles. E ambas as palavras-chave aqui
funcionam em cada loop em Java, incluindo os três
tipos que vimos até agora.
16. Projeto calculadora: Vamos colocar todas as habilidades que
aprendemos até agora nos EUA. Vamos fazer nosso
primeiro projeto. Vamos ser apenas
uma calculadora simples. Agora, a maioria das coisas que
você aprendeu até agora
será aplicada diretamente
dentro deste projeto. O que este projeto
foi projetado para ainda ser difícil se você é novo na programação quando
iniciou este curso pela primeira vez. Se você tiver algum problema
ou estiver lutando com esse projeto que é
esperado e não se preocupe, há três coisas principais
que eu queria fazer quando
se trata deste vídeo. O primeiro vai
passar por cima de um plano. Ao projetar qualquer programa, mesmo apenas uma calculadora simples, é importante
ter um plano e uma ideia geral do
que você quer
fazer antes de começar a
escrever código. A segunda coisa é que eu quero
que você experimente sozinho. Então, vou
mostrar passo a passo como eu nos faria. Mas antes que eu faça isso, quero que você pause
este vídeo e tente fazer isso sozinho
depois de analisarmos um plano. Enquanto cursos como
este ajudam, a melhor maneira de melhorar na
programação é o código certo. Eu encorajo você a
chegar o mais longe
possível por conta própria antes ver como eu
implementaria isso. Agora a terceira coisa
vai ser, vou mostrar como
fiz esse programa. Depois de criarmos
nosso plano juntos e depois de você tentar
fazer isso por conta própria, vou mostrar como
eu faria esse programa. Vamos começar com o primeiro passo, analisando um plano. O que esse projeto deve fazer? E o que precisamos fazer
para conseguir isso? Bem, a primeira coisa é que ele
deve pedir dois números. Então ele deve perguntar, ou uma operação matemática. Isso será uma multiplicação
ou divisão mais, menos. Então, seria um
desses quatro personagens. Depois, precisamos exibir
o resultado e, em seguida, voltar ao início
do programa, onde
pedimos números. Este é um
plano muito, muito básico quando
se trata desse projeto. Algumas dessas coisas
devem ser simples. Outras coisas
exigirão que você pense, talvez até voltando
às lições anteriores. Novamente, tente pausar
este vídeo
agora mesmo e chegue o mais longe
possível por conta própria e,
em seguida,
volte depois de concluir um projeto ou uma vez que seu 100% preso e você não
pode ir mais longe. E vou mostrar passo a passo como eu faria esse programa. Espero que você já tenha
tentado sozinho. Agora, vamos prosseguir e implementar cada uma
dessas etapas. Mas nosso plano aqui mostra um uso importante da leitura de
todas as instruções. Por exemplo, aqui
vemos, voltaremos ao
início do programa. Isso significa que todo
esse programa pode estar dentro de um loop while. Posso dizer mesmo que seja verdade. Agora, este será um
loop infinito que será executado para sempre, o que é bom para esse caso de uso. Agora vai dizer que
deve pedir dois números. Então, vou
começar fazendo um scanner chamando entradas, definindo isso igual a um novo scanner passando
no ponto do sistema n. Então vou imprimir
insira o primeiro número. Então vou dizer int número
um é igual ao ponto de entrada next int. Até agora,
pedimos um número. Vamos basicamente fazer a mesma coisa
exata para
o segundo número. Acabei de imprimir insira
o segundo número. E então vamos
ter outro inteiro, int número dois é igual ao ponto
de entrada next int. Até agora, o
primeiro passo está pronto. Agora temos os dois números. Agora devemos fazer
uma operação de matemática. Então, mais menos estrela ou
quatro barras será adição, subtração, multiplicação
ou divisão. Em seguida, vamos dizer ao
usuário o que fazer. Posso dizer que entre em uma operação. Então vamos dizer
quais opções existem. Além disso, menos estrela e barra. Como eu disse, String Operation
é igual ao ponto de entrada em seguida. Então agora temos acesso
aos números e
à operação que queremos. Agora, usar instruções if
para comparar duas strings não funciona corretamente com tudo o que lhe
ensinei até agora. Com isso dito,
vamos usar instruções
switch aqui. Posso dizer operação de comutação. Eu poderia então dizer
caso com um plus. Vou adicionar uma pausa
e depois vou
dizer caso menos break. Vou apenas ir em frente e
adicionar todos esses quatro. Temos case, star, break, case,
slash break. Agora, para obter um
resultado em tudo isso, preciso criá-lo fora
dessa cinta encaracolada. Os detalhes do porquê disso serão explicados
em um vídeo futuro. Então, vou criar um
número inteiro chamado resultados. Ainda não atribuirei um valor. Vamos fazer isso dentro
da nossa declaração switch. Então, se eles entraram em um plus, vou dizer que os resultados são iguais a número um
mais número dois. Certifique-se também de soletrar
vários corretamente. Então, de menos, vou dizer que
o resultado é igual número um menos número dois. Para multiplicação,
posso dizer que o resultado é igual número um vezes o número dois. E então, para a divisão,
posso dizer que o resultado é igual ao número um dividido
pelo número dois. Agora, fora da instrução
switch, posso imprimir o resultado,
como eu disse, o espaço de resultados. E posso adicionar os
resultados aqui. Agora, aqui estamos realmente
recebendo um erro e nosso IDE passando o mouse sobre isso, ele diz que os resultados das variáveis podem
não ter sido inicializados. Podemos seguir em frente e clicar
em inicializar uma variável. Ele simplesmente
atribuirá 0 aqui. Mesmo que vamos
substituir esse valor, ainda gosta de ver que
teremos um valor padrão
porque ele não
sabe ao certo se um desses quatro
casos será executado. Vamos seguir em frente e executar isso
e vamos ver o que acontece. Se eu pressionar Shift e F2, ele vai dizer insira
o primeiro número. Vou inserir cinco,
inserir o segundo número, três e virar a operação. Vou entrar na
multiplicação. O resultado é 15, e agora ele olha para
o primeiro número. Por exemplo, eu poderia fazer
105 e depois subtração. E aqui temos cinco. Então, ele continuará fazendo um
loop
repetidas vezes e continuará pedindo
o primeiro segundo número. E podemos então fazer qualquer tipo de operação que quisermos
com esses números. Agora tenha em mente que
estamos usando números inteiros aqui. Então, se você tentar vislumbrar, isso só lhe dará um número
inteiro de resultados. Se você quisesse resultados mais
precisos, você pode usar duplo e em vez de inteiro para a variável de
resultado. Agora, se você puder colocá-lo
neste programa por conta própria, então parabéns
e bom trabalho. Mas se ele precisasse
assistir alguns
dos vídeos extras
para fazê-lo, não se preocupe, isso está perfeitamente
bem, especialmente se você é novo na programação, porque esta é uma habilidade
nova. À medida que ele
segue no curso, mais coisas se tornam mais aparentes para você e mais fáceis para você. Só leva tempo para
aprender todas essas coisas.
17. Métodos: É aqui que
as coisas começam a ficar um pouco mais complicadas
, mas também mais divertidas. Este próximo tópico
é sobre métodos. Os métodos são basicamente
apenas um bloco de código executado e seu objetivo é
fazer uma coisa específica. Na verdade, trabalhamos
em um metodista o tempo todo. Esse método principal
aqui é executado por padrão sempre que
executamos nosso próprio programa. Mas podemos criar
nossos próprios métodos fora dos aparelhos encaracolados
para a função principal, posso dizer público, estático,
vazio, exemplo, parênteses
e, em seguida, aparelhos encaracolados. E aqui podemos escrever
o código que você quiser. Por exemplo, posso
simplesmente imprimir hello world. Então, em nosso método principal, posso dizer exemplo. E ele
saberá automaticamente que estamos tentando executar essa função. Se eu pressionar Shift e F2, ele deve executar nosso programa. E aqui vemos o HelloWorld
no console. Então, muita coisa está acontecendo aqui. E também
mencionei métodos, e também
mencionei funções. E as funções são
praticamente a mesma coisa, embora haja uma
pequena diferença. A função é basicamente
o que vemos aqui. Essa é tecnicamente uma
função e isso também. Mas sempre que uma função
estiver dentro de uma aula, o que explicarei
em um vídeo futuro. Agora eles são chamados de métodos, mas na maioria dos casos
isso não importa. Eles são
intercambiáveis na maior parte. Mas tecnicamente uma função está fora de uma classe e
um método está dentro. Agora, novamente, abordaremos as aulas mais detalhes
no futuro por enquanto, basta pensar nelas
como um contêiner que todos os seus
métodos podem se encaixar. Adicionar esses
parênteses aqui
invocará , executará ou
acionará essa função. Estes são todos termos
intercambiáveis basicamente de uma
maneira de executar a função. Essas também são
terminologias comuns que são usadas quando estamos realmente
tentando executar uma função. Agora você pode estar
se perguntando por que chamou o método de exemplo
quando podemos simplesmente imprimir o Hello World
no método principal. Bem, isso é porque
este é obviamente um exemplo simplificado demais. Em um programa real, talvez
você não queira usar
essa função de exemplo uma vez. Você pode querer usar
essa função de exemplo várias vezes
em toda a sua classe ou ter sido durante
todo o projeto. Ter a capacidade de
abstrair certas funcionalidades em seus próprios métodos torna muito mais fácil reutilizar
essa funcionalidade. Veremos isso em exemplos reais medida que avançamos
para o curso. Mas agora vamos explicar
o que
são esses parênteses e também o que esse
vazio significa aqui. Basicamente, uma função pode receber entrada e
também pode retornar a entrada. Vou me livrar
desses comentários. E se eu clicar no nome
do exemplo e pressionar Shift e F6, agora
posso refatorar ou renomear toda
essa função. Posso dizer adicionar. Agora, se eu pressionar Enter, ele renomeia a função, bem como
a invocação da função. Agora, dentro dos parênteses, podemos adicionar algo
conhecido como parâmetros. Por exemplo, posso dizer
int num one e int num2. Estes são separados por uma vírgula. Podemos até ter vários
tipos de variáveis. Por exemplo, exemplo de string. Mas neste caso estamos
apenas adicionando dois números. Portanto, não há necessidade de
ter uma string aqui. Agora, automaticamente
inteligente
nos dá essa seta vermelha aqui, dizendo que não podemos
chamá-la sem nenhum parâmetro. Assim, podemos passar
algumas informações aqui, por exemplo, 510, e agora não
temos mais erros, mas esse código não
funciona como esperamos. Isso porque ainda estamos
simplesmente imprimindo Hello World. Mas o que queríamos
fazer é
retornar a soma entre
num1 e num2. Posso dizer retornar número 1 mais num2. Agora isso nos dá um erro aqui. Se eu passar o mouse sobre ele,
ele diz que não pode retornar um valor de um método
com um tipo de resultado vazio. Isso evita aqui, significa que nada será devolvido. Temos que ser muito
claros que tipo de dados serão retornados
de cada função. Nesse caso, estamos
retornando um número inteiro porque estamos adicionando
para apresentar juntos. Assim, poderíamos alterar um vazio para
int e o erro desaparece. Agora aqui posso dizer
int sum é igual a adicionar 510, e posso imprimir alguns. Agora, se eu executar isso
com o Shift F dez, isso imprimirá
o 15º no console. Agora, se
quiséssemos, também poderíamos passar essa chamada de função dentro
da função de linha de impressão. E, de fato, a linha de impressão tem sido sua própria função integrada que usamos
esse tempo todo. Ele tem seus próprios parênteses
e estamos transmitindo informações para ele assim como estamos com essa função de adição. E aqui está um exemplo perfeito de por que queremos fazer funções. Porque posso copiar e colar
isso algumas vezes. E agora posso adicionar
valores diferentes de que eu queria. Isso agora nos dá três resultados
diferentes de 1520 e menos três. E é tudo porque temos uma
função de adição simples aqui. Agora, obviamente, esta é uma função
muito simples. Mas se tivéssemos funções mais
complicadas com mais código dentro delas, você pode ver os benefícios de ter que
escrever apenas o código uma vez e, em seguida, uma execução que de diferentes lugares como muitas
vezes quanto você quiser. Agora, uma última nota
é que estes aqui são tecnicamente
chamados de parâmetros, mas quando são
transmitidos, como aqui,
ou esses números diretamente,
eles ou esses números diretamente, são conhecidos como argumentos. Você tem parâmetros
e argumentos. Assim como funções ou métodos, eles são frequentemente usados de forma
intercambiável, mas tecnicamente,
o que você escreve
na própria função é
conhecido como parâmetros. E o que você passa para a função é
conhecido como argumentos. Mas, novamente, assim como
funções versus métodos, eles são frequentemente usados de forma
intercambiável.
18. Sobrecarga de método: No
vídeo anterior, criamos uma função de adição simples que retorna a soma
entre dois números. Mas e se quisermos
adicionar strings para criar uma frase? Por exemplo, posso
imprimir add hello and world. E, obviamente, isso não funciona. Mas é claro que eu poderia imprimir add 55 e isso funcionaria. Agora, normalmente, você só pode ter um método
com o mesmo nome, semelhante às variáveis,
mas podemos fazer algo conhecido como sobrecarga de método. Isso basicamente significa ter vários métodos
com o mesmo nome, mas parâmetros diferentes
e diferentes tipos de retorno. Por exemplo, posso dizer string
estática pública com S,
String s1 e S2 maiúsculas . Agora dentro daqui posso retornar
s1 mais um espaço mais S2. Basicamente, juntando as
duas palavras. Agora temos dois métodos
que têm o mesmo nome, mas os sobrecarregamos
onde o Java agora saberá qual deles chamar dependendo dos
parâmetros passados. Online, cinco estão
passando e cordas. Então, o que
chamará um método aqui? As linhas aderem para
passar um número inteiro. Então, o que chamará
o método aqui? Posso ir em frente e executar
este coldre na saída. Aqui vemos HelloWorld e dez. sobrecarga de métodos geralmente é útil em situações como essa, onde você tem
funcionalidades semelhantes, mas deseja passar em
diferentes tipos de variáveis. Você pode sobrecarregar esses métodos, basicamente conexá-los e ter parâmetros
diferentes e possivelmente um
tipo de retorno diferente se fizer sentido para você.
19. Escopo: Toda vez que criamos uma chave de
abertura, como esta aqui,
está criando algo
conhecido como escopo. E o escopo
limitará o que pode ou não usar
determinadas variáveis. Por exemplo, posso dizer
int counter é igual a 0. E então eu vou
criar um loop while para incrementar esse contador. Enquanto o contador é inferior a dez. Posso então dizer
contador plus plus. Agora podemos acessar como
contador perfeitamente bem, para que eu possa imprimi-lo aqui e tudo funciona como esperado. Mas o que acontece se eu criar
uma segunda variável dentro? Por exemplo, eu digo int
example é igual a 15. E eu deveria
imprimir isso por qualquer motivo. Obviamente, não
faz muito sentido, mas isso é apenas um exemplo. Tudo funciona até agora. Mas o que acontece se
eu tentar acessar exemplo fora
do escopo do loop while? Então eu poderia tentar
imprimir isso. Posso adicionar um exemplo e
recebemos um erro aqui. Se eu passar o mouse sobre isso, ele diz que não é possível resolver exemplo de
símbolo e ele
ainda tem uma solução aqui. Ou posso clicar para trazer o exemplo int para
o escopo atual. Observe que o exemplo é criado
online 14 aqui. Mas se eu for clicar
na solução, agora
estamos criando a
variável na linha nove, que está dentro do escopo da função
principal. Isso significa que tudo dentro da função principal pode usá-lo, incluindo o escopo do próprio
loop while, porque eu também estou dentro
da função principal. Então, ele mudou nosso
código para simplesmente reatribuir o exemplo
com o valor de 15. Mas estamos criando isso
fora do loop while. Agora, mesmo com tudo isso dito, não é uma boa
ideia simplesmente colocar cegamente todas as suas variáveis no
topo da sua função. Por exemplo,
digamos que eu não esteja imprimindo essa
variável aqui na linha 20. Nesse caso, a variável de
exemplo não precisa ser definida
no escopo principal. E, em vez disso, poderia ser
simplesmente definido no escopo do loop
while. Eu poderia dizer int exemplo. E então eu posso me livrar
da criação da variável aqui. Normalmente, a menos que você
tenha um bom motivo, você sempre deve
definir suas variáveis o mais localmente possível. isso, quero dizer, aqui, isso é localmente quanto possível porque estamos usando
a variável online 16. Então, ele vai para o seu local
para o escopo bem aqui. Não há necessidade de defini-lo
fora no escopo principal, porque agora
com esse código, não
estamos usando um anti,
o escopo principal. Estamos apenas usando isso dentro
do escopo do loop while.
20. De Ternary Operator: Às vezes, você pode
querer escrever uma instrução if, mas de uma forma mais condensada, esse geralmente é o
caso sempre que você deseja ter um único
valor ou que você está atribuindo a uma variável dependendo de um declaração verdadeira
ou falsa, podemos conseguir que
isso era algo conhecido como operador ternário. Isso basicamente será
algum tipo de
condição seguida
por um ponto de interrogação, depois um valor verdadeiro, dois pontos e, em seguida, um valor falso. Agora isso pode parecer confuso. Então, vamos dar uma
olhada em um exemplo real. Vou criar
um booleano chamado é membro até que
isso seja igual a verdadeiro. Isso pode ser se você estiver
pagando por uma assinatura em algum lugar e eles oferecerem
um único pagamento único, eles podem lhe dar um
desconto nessa compra. Por exemplo, aqui posso dizer que preço
int igual é membro. Agora, novamente, esta
é a nossa condição. Uma condição é apenas uma expressão
booleana. Então, uma simples declaração booleana
funcionará muito bem. Então, ponto de interrogação, e então
temos nosso verdadeiro valor. Nesse caso, o
preço pode ser de US $10. Mas o que diz que
queremos cobrar um preço mais alto para pessoas
que ainda não são membros. Então eu posso adicionar qualquer dois pontos e, em seguida, o preço aqui pode ser de US $40. Agora posso ir em frente e
imprimir o preço aqui. E eu posso executar isso
com shift e FTN. Aqui vemos dez no console. Mas se eu mudar é membro
para false e eu executar isso, vamos
ver 40 no console. A razão para isso agora é que
essa condição aqui é falsa. Então, o que vai usar esse código aqui, que era
parcialmente falso valor, qualquer coisa após os dois pontos
será usada. Se a condição for falsa, qualquer coisa antes do cólon será usada se for verdade. Agora, obviamente, poderíamos fazer
algo semelhante a isso. Se eu disser int price é igual a 0, então posso dizer se é,
lembre-se, agora posso
dizer que o preço é igual a dez, contrário o preço é igual a 40. E isso funcionará exatamente
da mesma maneira. Mas um operador ternário realmente brilha aqui sempre que
você estiver usando instruções if
muito simples onde você quer que isso esteja em
uma única linha de código. Porque, obviamente,
escrever essa linha de código é muito mais fácil do que
escrever tudo isso.
21. Arrays: Vamos agora falar sobre matrizes, que são basicamente apenas uma
coleção de variáveis. Por exemplo, digamos que eu tenha várias
pontuações diferentes do teste de alunos. Posso dizer int student
um é igual a 96, int aluno dois é igual a 49, aluno três é igual a 76, e assim por diante e assim por diante. A menos que eu tenha um monte
desses, bem, eu não quero necessariamente criar um monte de variáveis
diferentes. Em vez disso, posso criar uma variável que é
conhecida como uma matriz. Isso basicamente será
uma coleção ou uma lista de várias variáveis
diferentes. Preciso primeiro especificar a variável que
a matriz vai conter. Cada matriz só pode conter
um, um único tipo. Você não pode misturá-los e combiná-los. Por exemplo, você não pode
ter um número inteiro com uma string que todos precisam
ser do mesmo tipo exato. Então eu posso dizer int, abrindo e fechando
colchetes. Isso representa uma matriz. Eu não poderia dizer que as pontuações dos alunos
são iguais a uma nova largura int, os colchetes também. Isso
criará nossa própria matriz. Mas sempre que estamos criando
array sem valores iniciais, o que mostrarei um
exemplo aqui em um momento, precisamos especificar quantos tipos diferentes de elementos queremos abrir espaço
para. Nesse caso, eu queria
abrir espaço para três. E agora eu criei em
array que pode conter até os três inteiros para
atribuir um valor específico. Posso dizer que as
pontuações dos alunos, colchetes. E aqui é onde especificamos algo conhecido como índice. Este é basicamente
apenas um contador para qual slot exato vamos
usar entre os
três que recebemos. Isso começa a contar em 0. Então posso dizer que o
índice de pontuação dos alunos de 0 é igual a 96. índice
de pontuação dos alunos de um é igual a 49. Índice de pontuações
dos alunos de dois é igual a 76. Agora vou ir em
frente e me livrar desses três números inteiros
aqui em cima. E agora eu quero
imprimir cada um deles
no console. Então, para fazer isso, podemos usar uma sintaxe
muito semelhante a isso. Assim, posso imprimir o índice de
pontuação dos alunos de 0. Vou ir em frente
e copiar e colar isso usando Controle
C e Controle V, ou Comando C,
comando V em um Mac. E agora posso alterar
esses índices para 12. Agora eu posso executar isso
com shift e FTN. Aqui vemos todos os três números. Mas o que acontece se eu tentar
acessar o índice três, que realmente não existe. Na verdade, recebemos esse
pequeno aviso aqui. Se eu passar o mouse sobre isso, ele diz que o índice da
matriz está desequilibrado. Se eu for executar isso, na verdade
vamos receber um erro
em nosso console. E isso é conhecido
como uma exceção. Uma exceção é
que algo vai dar uma olhada no futuro. Mas, por enquanto,
pense nisso como um erro. A razão pela qual conseguimos isso
é porque estamos tentando acessar algo para o qual a
matriz não tem espaço para. Só atribuímos espaço para
três inteiros nessa matriz, e usamos todos os três. Mais uma vez, lembre-se, ele
começa a contar em 0. Então, os três pontos que
temos nosso 012. Portanto, o índice
três não pode existir. E diz
tentar acessar algo fora dos limites
dessa matriz. Mais um exemplo que quero
mostrar é como criar um número inteiro definindo
valores específicos ao criá-lo. Então, em vez de especificar
três, podemos excluir isso. E depois dos
colchetes, vamos criar
nossos próprios aparelhos encaracolados. Aqui. Podemos adicionar qualquer
número de elementos. Queremos Exemplo noventa e seis, quarenta e nove e setenta e seis. E agora temos
esses avisos aqui. Se eu passar o mouse sobre ele, ele diz que uma variável já está
atribuída a esse valor. Então, essencialmente, essas
três linhas de código aqui não são
necessariamente qualquer. Ao excluí-los e eu
executar o programa novamente, vamos obter
a
mesma saída exata que você vê aqui. Agora podemos ter matrizes para
qualquer tipo de variáveis. Por exemplo, podemos
criar uma matriz de strings ou uma matriz de booleanos, mas este é um
exemplo muito simples com números inteiros. E uma última coisa que eu
queria mostrar a você é como acessar o comprimento ou o número de
elementos dentro de uma matriz. E uma última coisa que eu
queria mostrar é como
acessar quantos elementos são, quantos itens estão
dentro de uma matriz? Posso imprimir isso. Vou acessar as pontuações
dos alunos aqui. Podemos acessar o comprimento. Isso vai ser um número inteiro, e vai dizer
quantos elementos estão dentro dessa matriz. Então eu posso ir em frente e executar isso. Aqui vemos o número três porque existem
três elementos. Se eu adicionei um extra aqui, posso então executar isso
mais uma vez e devemos ver quatro como fazemos aqui. Agora, é claro que não
vemos os 100 impressos no console porque
não estamos imprimindo o índice três, que agora existe
graças a este 100 aqui. Mas estamos apenas
imprimindo os zeros iniciais ou o 100 está em
exibição no console.
22. Para cada loops: No vídeo anterior,
demos uma olhada em como criar matrizes e também como acessar
cada elemento individual. Mas e se tivéssemos
um número maior de números inteiros e não quisermos imprimir
principalmente cada um deles. Podemos usar um
loop padrão ou algo conhecido como um para cada loop para seguir em frente e
percorrer cada elemento. Aqui, vou
mostrar dois exemplos. Aqui temos um
padrão for-loop. Também vou mostrar um novo conceito que é um para cada loop. Mas primeiro temos um padrão
for-loop, como eu digo, para parênteses, aparelhos encaracolados. E por dentro, primeiro
vou criar meu próprio
contador int inteiro igual a 0. Enquanto o contador é
menor do que os alunos pontuam a duração dos pontos. Podemos então aumentar o contador. E então aqui eu certamente
posso imprimir índice de pontuações dos alunos do contador. Podemos passar as variáveis
como um índice aqui. E isso acessará o índice 0, depois 12, e assim por diante até percorrermos
cada elemento desse array. Para provar isso, posso executar
isso com shift e F11. Aqui vemos todos os quatro
números em nosso console. Agora, fazer um loop através de arrays é tão comum que eles fizeram
uma sintaxe mais curta. Vou
comentar essas três linhas. Aqui. Vou usar algo
conhecido como loop para cada. Posso dizer para o número int, dois pontos, depois o
nome da nossa matriz. Nesse caso, um aluno pontua. Dentro daqui, o número de
variáveis manterá
cada elemento individual à medida que ele percorre eles. Portanto, na primeira iteração
desse loop, a variável numérica
manterá o valor 96. Na próxima vez que ele passar,
ele terá 49 e assim por diante. Para provar isso, posso imprimir o número e posso executar
isso com shift e FTN. E aqui vemos a
mesma saída exata. Agora, normalmente um loop
foreach funcionará, mas em alguns
casos de uso você pode precisar acessar o índice
que está usando. Por exemplo, essa
variável de contador aqui. Nessas situações, você pode
simplesmente usar um loop for-loop padrão. Mas, novamente, na maioria
das situações , o para cada loop
ficará bem.
23. Arrays multidimensionais: Em vídeos anteriores, demos
uma olhada em matrizes simples, mas agora vamos dar uma
olhada em matrizes multidimensionais. Basicamente, um Raisa tem
matrizes como valores. Aqui vou criar uma matriz que tenha
uma matriz de pontuações. Por exemplo, posso dizer que
int dois colchetes aqui, pontuações são iguais a chaves. E dentro daqui vai
esperar outra matriz de valores. Mas, para definir esses arrays, vamos
usar os aparelhos encaracolados. Por exemplo, temos nossos aparelhos
encaracolados com noventa, seis, quarenta, cinco e oitenta. Agora, para facilitar a
compreensão listada agora, para facilitar
a compreensão que isso será
para o Test1. Em seguida, temos o test2, que tem pontuações diferentes, digamos 8666 e depois 90. Como queremos percorrer
cada elemento individual? Primeiro, temos que percorrer
cada matriz individual, onde o valor se torna
cada matriz individual aqui. Assim, podemos usar um
loop padrão , bem como
um para cada loop. Vou te mostrar um
exemplo de ambos. Para o padrão for-loop, acho que para o
contador int é igual a 0, enquanto o contador é
menor que a pontuação do comprimento do ponto, posso então aumentar o contador. Agora, dentro daqui,
precisamos de algo conhecido como aninhado para loop. Onde está, onde temos
um loop dentro de um loop? Posso dizer que o
contador int é igual a 0, enquanto o contador dois é
menor que as pontuações, índice de comprimento do ponto do contador
mais contador para
o que está acontecendo aqui. Basicamente, estamos fazendo
um loop padrão, que tenho certeza que você já
entende. Mas então temos um
aninhado for-loop. Estou criando uma segunda variável de
contador e estou usando-a em todos os lugares,
além daqui. Basicamente, o
que vai acontecer é que estamos percorrendo cada array
individual. E é a isso que
teremos
acesso no primeiro for-loop. índice 0 do primeiro
for-loop será todo
esse índice de matriz um, ou a segunda iteração à medida
que ele percorre novamente, será toda essa matriz. Mas agora vamos acessar cada elemento individual dentro do índice de
pontuações do contador no início vai
acessar essa matriz aqui. Estamos acessando a
propriedade length da primeira matriz. E então, como o
loop de loop inicial novamente, teremos acesso
ao segundo array porque
contador com um igual. Mais uma vez, lembre-se que este é o índice 0. Índice um. Os índices começam a contar em 0. Então, para acessar cada
valor individual, posso imprimir. Primeiro, vou
imprimir test plus, adicionarei entre parênteses e
posso dizer contador mais um. A razão para isso é
porque o contador começa em 0 e queremos dizer test1, test2 e não teste 0, teste um. Vamos simplesmente
adicionar um ao balcão. Mas isso não
modificará a contra-variável porque estamos
essencialmente pegando o valor do contador
e adicionando um. Mas não estamos atribuindo isso
à contra-variável. Depois, vamos
adicionar em cada pontuação individual. Por exemplo,
índice de pontuações do contador
e, em seguida, um segundo colchete, índice de contador para parar. Eu corro isso com shift e F2. Agora vemos o test1 é 9825
e o teste dois é oitenta e seis, sessenta e seis e noventa. Só para simplificar um pouco
as coisas, se eu me livrar desses
parênteses e eu executar isso, basicamente
obtemos a mesma
coisa exata, exceto que esse contador aqui mostrará o índice
0 à medida que estamos percorrendo
o primeiro array e index1 à medida que estamos
percorrendo o segundo array. A única razão pela qual
eu adicionei mais um aqui é para torná-lo
mais legível por humanos. Agora, como você pode dizer, esse
código é um pouco confuso. E, normalmente, você não
vai trabalhar com arrays
multidimensionais que muitas vezes, ideal é que haja
soluções melhores para lidar com seus dados, especialmente se seus dados precisarem três ou mais
dimensões de arrays, geralmente
sempre
haverá uma solução melhor do
que usar muitos arrays aninhados. Mas só para estar completo aqui, vou seguir em frente e mostrar como
fazer um loop através uma matriz aninhada ou
uma matriz multidimensional
em vez disso, com um, para cada loop, eu
digo para int array, eu posso chame essa matriz
uma pontuação de dois pontos. Isso vai percorrer
cada array individual. Agora, dentro daqui, temos
acesso a cada array. Então, para a primeira
iteração disso, para cada loop, vamos
ter acesso a esse valor. E, em seguida, na próxima iteração teremos
acesso a esse valor. Podemos usar um padrão para
cada loop neste array. Para número, dois pontos da matriz um. Agora, dentro daqui,
podemos imprimir o número. Agora eu posso executar isso
com shift e F2. E aqui vemos todos os seis números
individuais. Este é um bom exemplo, como mencionei
no último vídeo, que para cada loop não
tem acesso ao índice. Aqui estamos dizendo
esse número de teste porque estamos essencialmente
usando o índice aqui. Ambos para cada loop. Não
temos necessariamente acesso a isso. Se você quisesse acessar o índice para
imprimir o número do teste
e, em seguida, você teria que
usar um loop for-loop padrão.
24. Varargs: Agora que temos uma melhor
compreensão dos arrays, podemos abordar um conceito
conhecido como varargs, que é uma
maneira diferente de passar tantos parâmetros diferentes
quanto você quiser para uma função. Então, vou fazer uma função de adição
muito simples. Posso dizer public,
static int add. E aqui eu posso ter int num1, int num2 dentro daqui. É muito simples. Simplesmente retornamos
num1 mais num2. Agora, para garantir
que tudo funcione, posso imprimir add
pass em 1015, e posso executar isso
com shift e F11. Aqui vemos a soma como 25, então tudo
parece estar funcionando. Mas e se eu quiser adicionar
outro número aqui, ou vários
números diferentes quantos eu quiser. O problema aqui
é que agora tenho que adicionar um parâmetro individual para cada entrada e várias entradas
podem mudar. Bem, o conceito de
varargs resolve isso. Basicamente, podemos passar qualquer número de números inteiros
para nossos parâmetros. Por exemplo, posso dizer
int três pontos e , em seguida, ninfas ou
números, o que você preferir. Numbers será essencialmente
uma matriz. Com isso dito, não
temos mais acesso a num1, num2. Em vez disso, agora
precisamos percorrer cada
elemento individual dessa matriz, como eu digo, int sum é igual a 0. E então eu posso devolver alguns. Mas antes de
voltarmos, precisamos realmente adicionar cada
número à soma. Posso usar um loop for-loop padrão ou ele pode usar um para cada loop. Então, para o número int, números
de dois pontos. E então posso dizer que a
soma é mais igual ao número. Então agora eu posso executar isso e
devemos ver a soma de todos esses números
aqui, que em 53. Podemos até diminuir isso para
quantos ou poucos
argumentos quisermos. Por exemplo, eu posso apenas ter lata e ela vai
imprimir dez. Agora, uma coisa a ter
em mente é que varargs precisam ser o
último argumento. Porque se tivéssemos coisas
adicionais aqui, por qualquer motivo, digamos que tenhamos um
aluno inteiro aqui. Não sabe onde o
começo e onde eles param. Se tivermos
argumentos adicionais que precisaremos
adicioná-los antes dos varargs. Varargs deve
estar sempre no final. Então, ele sabe por onde eles começam, e sabe que cada
outro parâmetro passado, ele será acessado
como esse varargs. Por exemplo, dez aqui serão alunos, e na verdade identifica
isso aqui, mas qualquer número adicional aqui. Então, apenas 515 agora
farão parte do parâmetro
varargs.
25. Constants e Casting: Às vezes, talvez você não queira que suas variáveis
alterem os valores
e, às vezes, também
pode querer alterar o tipo de variáveis
que suas variáveis são. Vamos começar
dando uma olhada em algo conhecido como constantes. E isso basicamente significa que um valor de variável não pode mudar. Se eu disser que
o nome da string é igual a Alex, posso
imprimir isso no console. E, claro, antes de fazer isso, posso mudar isso para o meu nome completo, que
é Alexander. Mas vamos dizer hipoteticamente, eu não quero que esse
valor mude. Posso adicionar a palavra-chave final antes de criarmos nossa variável. E agora recebo um
erro aqui. Se eu passar o mouse sobre isso, ele dirá
que você não pode atribuir um valor a
uma variável final. O nome pode estar se perguntando, por que você iria querer fazer isso? Por que não simplesmente não alterar
o valor da variável? Essa pode ser a solução
óbvia quando
se trata de programas simples
como este. Mas em programas reais
onde você tem centenas de arquivos em centenas de milhares
de linhas de código potencialmente, e potencialmente até
outros colegas de trabalho. Talvez você não se lembre de
tudo o que seu código faz. E você também pode não se lembrar
que certas variáveis podem ter efeitos colaterais
se você alterar os valores. Se você vai
ter uma variável cujos valores não devem mudar, então você deve torná-la uma
variável final com essa palavra-chave aqui. Agora em seguida, vou mostrar algo conhecido como casting, que é basicamente onde
você pode pegar uma variável e atribuí-la a uma
variável diferente de um tipo diferente. Por exemplo, eu poderia dizer
int amount igual a dez. E eu posso então criar um duplo que contém
um valor decimal. Portanto, podemos
ter números não inteiros. E posso dizer que o novo
valor é igual ao valor. Agora, se eu for em frente e imprimir uma
nova quantia e executar isso
com shift e FTN. Agora vemos dez pontos 0. E neste caso,
na verdade, não precisamos lançar nada porque todas as duplas ainda podem ser inteiros
tecnicamente. Mas uma vez que criamos um
duplo, ele vai adicionar
o decimal de 0, mas vamos supor que isso
seria revertido. Posso dizer que o
valor duplo é igual a 10,5. Eu poderia então dizer que int new
amount é igual ao valor. E recebemos um erro aqui. Se eu passar o mouse sobre isso, ele diz que o tipo necessário é um número inteiro, mas fornecido o tipo como um duplo. Bem, podemos fazer algo
conhecido como lançar este inteiro exceto o valor duplo
como um valor inteiro. E para fazer isso, podemos adicionar entre parênteses e
o tipo de variável, neste caso int logo antes
do nome da variável de destino, que neste caso é quantidade. Agora, se eu executar isso, agora
dizemos dez no
console e não 10.5, porque os números inteiros
só podem ser números inteiros. Então, qualquer coisa que não
seja aceitável, por exemplo, esse 0.5 será ignorado. O número inteiro que
sobra neste caso, tin será atribuído
à nossa nova
variável de quantidade aqui. Agora é assim que você
elabora valores primitivos. E vou discutir a diferença entre
os tipos de valores
primitivos e
de referência em um vídeo futuro. Vamos dar um
exemplo rápido de como
converter um inteiro
em uma string. Por exemplo,
temos um número inteiro dez, mas queremos a string
dez, algo assim. Bem, posso dizer que o
número int é igual a dez. Então posso dizer string,
string é igual a string com
um valor de ponto S maiúsculo de. Aqui podemos ver
todos os diferentes parâmetros
possíveis
que podemos passar. Podemos passar em um inteiro, um char ao longo à tona
e tantos outros. Nesse caso, só
queremos passar um número. E então eu posso imprimir a
string no console. E se eu executar isso,
vamos ver dez como uma corda. Agora, se eu quisesse
fazer o inverso aqui, posso dizer string, string
é igual a dez entre aspas. Eu poderia então dizer int number. Eu poderia então dizer inteiro com
um maiúsculo eu ponto-parse int. E aqui vemos que
podemos passar em uma corda. E essa função superior também
retornará um número inteiro. Posso passar os argumentos de
string. Em seguida, posso imprimir o
número no console. Se eu executar isso, ainda
deveríamos ver dez. Mas agora esse é um valor numérico
real. Então eu queria, eu poderia aumentar isso em um
antes de imprimi-lo. Agora, com o C11, de antemão, estávamos convertendo um
número em uma string, então não pudemos aumentar isso
uma vez que já estivesse
na forma de string.
26. Métodos comuns de corda: Neste ponto, você já
deve saber como um básico se Stephen funciona. Mas se você já tentou comparar strings
com uma instrução if, você pode notar que ela
não funciona corretamente. Por exemplo, vamos começar
pedindo ao usuário alguma entrada. Eu poderia dizer digite seu nome. Depois,
vou criar um scanner. Vou chamar essa entrada. Vou fazer isso igual a um novo scanner passando
no sistema ponto n. Isso tudo é
algo bem semelhante que já vimos antes. Eu poderia dizer stream, nome de
usuário é igual ao ponto
de entrada na próxima linha. Isso recuperará toda a linha que o usuário inseriu. Agora vamos dizer que se eu
digitar meu nome como Alex, ele dirá oi Alex. É claro que, em um programa real, poderíamos apenas usar
o valor da variável. Mas eu quero fazer isso
especificamente em uma declaração if para
demonstrar algo. Posso dizer que se o nome de usuário é
exatamente igual ao Alex, não
consegui imprimir o Hello Alex. Posso executar isso com
Shift e deixá-lo. Eu poderia então digitar meu nome
e vou inserir
a string exata que estamos
procurando na instrução if. Então Alex, com uma maiúscula, se eu for em frente
e entrar nisso e depois pressionar Enter, não
veremos nada
impresso no console. Isso porque
os pontos fortes não podem ser comparados usando um sinal de igual
duplo. Se eu passar o mouse sobre isso, ele diz que os valores de string
são comparados usando iguais
duplos e não
iguais como um método. Para comparar strings. Em vez de usar massa igual, podemos pegar a corda,
podemos pressionar ponto. E aqui temos acesso
a várias funções diferentes. Veremos alguns deles no
final deste vídeo. Mas o que eu quero
mostrar é chamado igual, bem como
igual a ignorar caso. Então, vamos começar com iguais. Aqui podemos passar
em outra string, por exemplo, Alex
e eu podemos executar isso. E agora posso entrar na
Alex com uma maiúscula ,
e então dirá Olá Alex. Se eu executar isso de novo, posso
entrar na Alex com uma letra minúscula e nada que imprimimos. Se eu quisesse ignorar a maiúscula
de qualquer string, então posso dizer que é igual a ignorar
caso e depois transmitir Alex. Então, se eu executar isso, agora posso inserir Alex com uma letra minúscula. E ele imprimirá Hello Alex, porque ele não vai se
importar com a maiúscula
de qualquer string. É assim que comparamos duas strings dentro de
uma instrução if. Mas agora vamos dar uma
olhada em alguns
outros exemplos de métodos de string comumente
usados. Vou seguir em frente e
excluir todo esse código. E eu simplesmente vou
dizer que o nome da string é igual a Alex. E então dentro daqui
eu não vou imprimir o tema, adotar em letras minúsculas. Eu não consegui executar isso
e vamos
ver Alex que tem uma maiúscula. Agora nós os exibimos todos
minúsculos no console. De forma semelhante,
também temos que maiúsculas. E, claro, se eu executar isso, vemos Alex em todas as
letras maiúsculas e no console. Há algumas
outras funções
que temos , como comprimento. Se eu executar isso,
veremos
quantos caracteres individuais
estão dentro da string. Neste caso, é para. E podemos, na verdade, apenas
pressionar um ponto no final do nome e vemos vários
outros métodos que podemos usar. Por exemplo, aqui podemos obter um personagem em um índice específico. Aqui posso obter o índice um, que deve ser uma letra minúscula l. Se eu executar isso, podemos
confirmar isso em nosso console. Aqui vemos uma
minúscula eu voltei. Temos várias
outras opções. Por exemplo, podemos concat, o que significa concatenar, basicamente adicionando uma parte
extra de uma string. Então eu posso adicionar todo
o meu sobrenome aqui. E se eu executar isso,
agora vemos Alex Flores. E o espaço que adicionou
no console é por causa do
espaço que adicionei aqui. Por padrão, ele não
adicionará espaços. Ele só fará exatamente
o que você disser. Sinta-se à vontade para mexer com algumas outras
funções de string aqui, há uma série
de úteis que você pode realmente usar para alterar a string ou usar
a string de maneiras diferentes.
27. Sequências de fuga: Vamos agora mergulhar em
outro conceito de string conhecido como sequências de escape. Isso basicamente será caracteres
individuais que têm significados
específicos
dentro de restrições. Por exemplo, posso dizer string,
string é igual a hello
space, world. Vou ir em frente e
imprimir isso no console. E é claro que
isso imprimiria o hello world. Mas e se eu quisesse que o olá e o
mundo estivessem em linhas diferentes? Bem, eu posso usar uma barra
para frente n. Agora isso se torna
uma cor laranja. Isso porque isso é conhecido como uma sequência de escape para slash
n será uma nova linha. Para provar isso, posso
executá-lo swift shift e FTN. Aqui vemos o Hello World
na próxima linha. Outro é a barra frontal n, que será uma guia. Por exemplo, depois de
adicionar uma nova linha, agora
posso adicionar uma nova guia. E eu posso executar isso de novo. Aqui vemos Hello world, mas o mundo agora é recuado
uma vez por um personagem de tabulação. Também podemos fazer duas barras
para frente, o que só se torna uma
única barra para frente. Por causa de horas, adicionamos
uma única barra para frente. Vai supor que
isso seria
um personagem de fuga ou
uma sequência de fuga. Mas se eu quisesse uma barra
direta real e a string, eu não precisava escapar
dessa barra basicamente apenas adicionando
200 palavras office. Eu posso então executar isso. Aqui. Agora vemos uma
barra na cadeia de caracteres. Considerando que, de antemão
, vai supor que vamos tentar
escapar com um W maiúsculo, o que realmente não
significa nada. Então, agora vai nos
dar um erro. Também podemos escapar de
aspas duplas. Então, isso só se tornará
uma aspas duplas normais. E a razão para isso é
porque aspas duplas representam o início ou
o fim de uma string. Se eu simplesmente
adicionar aspas duplas aqui, não saberá
que isso vai fazer
parte da string. Em vez disso, pensa que estamos tentando na string atual
como uma variável. Se eu fosse ao mundo para ficar entre aspas, posso adicionar aspas duplas, mas tenho que escapar delas adicionando uma predição de
antemão. Agora isso está parecendo
um pouco confuso. Então, vou substituir todas as sequências de
escape anteriores por apenas um espaço simples. Então agora eu posso executar isso e
devemos ver o Hello World, mas o mundo está envolvido
dentro de aspas duplas. Agora, há vários outros caracteres
de
sequência de escape que você pode usar, mas esses são de longe
os mais comuns. Você vai ver.
28. O curso de matemática e números aleatórios: Vamos dar uma
olhada na aula de matemática. E isso tem algumas coisas
diferentes que podemos fazer quando se trata de operações matemáticas
básicas. O primeiro exemplo será obter o valor absoluto de um número, que basicamente
irá converter um número negativo em
um número positivo. Mas, mais tecnicamente,
isso
contará a distância desse número para 0. Vou imprimir matemática
com um M dot abs maiúsculo, que significa valor absoluto. E aqui podemos
ver que podemos passar vários valores
numéricos diferentes. Nesse caso, podemos
passar em dez positivos. Fui copiar e colar isso
e passar menos dez. E então eu posso executar isso
com shift e FTN. E aqui vemos
lata em ambos os casos. Então, em termos básicos, isso apenas
converterá um
número negativo em um número positivo. Vou seguir em frente
e comentar isso. Seguindo em frente, posso
imprimir o mínimo de ponto matemático. E isso vai assumir dois números do mesmo tipo, e isso retornará o valor
mínimo entre eles. Por exemplo, posso passar 107, também
imprimindo math.max, que é um conceito semelhante, mas retornaremos o valor
máximo entre eles. Também posso devolver
107 aqui também. Então, se eu executar isso na primeira vez, teremos sete porque esse é o valor mínimo. Mas na segunda vez
vamos conseguir dez porque esse é o valor máximo
dele. Agora, se dissermos ponto matemático e
passarmos por tudo isso, há várias operações matemáticas
diferentes. Então você pode estar familiarizado
, dependendo de quão experiente você é
com a matemática na escola. Mas alguns
exemplos mais básicos serão o piso, que basicamente apenas
arredondado número para baixo. E também sela, que irá aumentar um número. Por exemplo, posso passar em 0,2. Eu posso embrulhar isso dentro de
imprimir isso aqui. Então também posso imprimir Math.Floor e
posso passar em 0,9. Agora, se eu executar isso
dentro do nosso console, veremos
um e também 0. Isso vai arredondar, não importa o que aconteça, não
importa se é menor que cinco. E vai arredondar para
baixo, não importa o que aconteça, não importa se é
maior ou igual a cinco. Agora, mais uma coisa que eu
queria mostrar a vocês é como
gerar um número aleatório. Existem duas maneiras de fazer isso. Há uma
maneira mais antiga que você
provavelmente vai vê-la por trás um tempo dentro de trabalhar com outro código estão seguindo
outros tutoriais. E há uma maneira mais nova. Da maneira mais antiga, posso dizer int
random é igual a novo aleatório com parênteses R
maiúsculas aqui ao pressionar Alt e
Enter para importar isso, eu poderia então dizer Nextint. Em seguida, posso imprimir
aleatoriamente para o console. Então, se eu executar isso, vamos
obter um número aleatório. Obviamente, isso vai
gerar qualquer número aleatório, mas não
necessariamente queremos isso. Muitas vezes queremos que
algo entre 010 são apenas 0100,
coisas assim. Assim, podemos passar em
um número inteiro aqui. Por exemplo, dez, corra a gente. Agora vai gerar
um número aleatório entre 09. Mas se
quiséssemos de
um a dez, podemos simplesmente adicionar
um ao final disso. Então, se eu executar isso de novo,
aqui vemos dois. Não sei se eu continuar executando
isso, vamos conseguir seu número aleatório entre 110. Esta é a
maneira antiga de fazer isso. Existe uma nova maneira. Então o número aleatório sabia, eu poderia dizer int
random igual a thread, ponto aleatório
local, ponto
atual próximo int. E isso funciona da
mesma maneira que antes. E também com a velha
e a nova maneira de fazer
este fim de semana geram
outros valores aleatórios, por exemplo, booleanos. Se quiséssemos um valor
verdadeiro ou falso aleatório, que surgirá
de tempos em tempos. Você pode usar o próximo booleano. Você pode obter carneiro em seguida, duplas e outras
coisas assim. Mas, por exemplo,
aqui podemos passar um int e, em seguida, o
limite será dez, e adicionaremos um
ao final dele. E eu posso imprimir
aleatoriamente para o console. Portanto, essas são as duas maneiras
diferentes de gerar números
aleatórios dentro do
seu programa Java.
29. Variáveis de tipo Primitivo vs de referência: Este vídeo será
um pouco mais avançado do que
os vídeos anteriores. Vamos aprender
sobre variáveis primitivas versus tipo de
referência e como determinadas variáveis
são armazenadas na memória. Então, vou minimizar
meu projeto aqui. Então, temos mais espaço
para esses diagramas. Aqui temos a pilha e
aqui temos a pilha. Esses são dois locais
diferentes onde as informações podem ser armazenadas
na memória do computador. Começaremos falando
sobre valores de tipo primitivos. Por exemplo, eu poderia dizer
int number é igual a dez. Isso é conhecido como um tipo
primitivo evalue normalmente armazena informações básicas
. Todos os valores do tipo primitivo são armazenados diretamente na pilha, e isso vai de
baixo para cima. Outros exemplos seriam booleanos. Posso dizer que a programação é
igual a verdadeira? Eu posso então ter
carta char igual a a. Eu posso ter um duplo,
eu posso chamar isso de pi. E isso é igual a 3,14159. E esses são os principais valores do
tipo primitivo que
você verá. Deixe-me voltar. Deixe-me excluir alguns desses e vamos
voltar ao nosso número. Mas o que acontece
se eu atribuir um número igual
ao
valor do número um. Por exemplo, o número dois
é igual a número mais ousado,
na verdade, ainda criará um valor
totalmente novo na pilha. Agora, o número dois é igual
ao valor do número. O que aconteceria
se eu modificasse o valor do número um
que afeta o número dois, vou imprimir o número. E então, na próxima linha,
vou imprimir o número dois. Antes disso, vou dizer que
o número é igual a 15. O que vai acontecer aqui é porque esses são
dois valores separados. O número dois não será
afetado. Então, isso imprimirá
15 e depois dez. Para provar isso, posso
executá-lo com Shift e FTN. Aqui vemos 1510. Portanto, os tipos primitivos terão seu próprio
valor individual na pilha, mesmo se estivermos
atribuindo-o a uma variável existente. Isso simplesmente
criará outra variável na memória do
seu computador e
atribuirá esse valor a ela. Isso significa que a linha
oito
criará um inteiro separado que não tem nenhuma correlação com essa linha número sete, além do fato de que eles compartilham o mesmo valor. Isso é bom, mas o que
é um tipo de referência? E enquanto a pilha usada. Então, vou
deixar todo esse código aqui e vou
criar um array inteiro. Posso dizer que números int
são iguais a 51015. E isso vai
criar algo tanto
na pilha quanto na pilha. Mas os valores 51015
são armazenados na pilha. E os números variáveis serão armazenados na pilha. Mas isso só vai
armazenar algo
conhecido como ponteiro. Não os detalhes exatos de
como os ponteiros funcionam
nos bastidores não são muito importantes
quando se trabalha com Java, porque o Java lida
com muito disso para nós. Mas isso basicamente apenas aponta para o valor real que foi armazenado no heap. Por exemplo, posso criar
outra matriz aqui. Posso chamar esse exemplo. Posso definir isso igual a números. O que acontece aqui são
nossos valores de matriz 51015. Ainda existe apenas uma vez
na memória do nosso computador. E esses três
valores são armazenados no heap como uma matriz. Mas as variáveis, números e exemplo são
armazenados na pilha, mas agora são ponteiros
apontando para a
matriz de números inteiros. Isso significa que se
modificarmos 510 ou 15, vamos realmente
ver essa mudança,
independentemente da variável que
estamos tentando acessar, sejam
números ou exemplo. Para provar isso,
posso dizer números, índice um, que
será o dez aqui, é igual a 11. Em seguida, posso
imprimir números index1. E então eu posso
imprimir o exemplo do índice um. Posso executar isso com
shift e FTN. Aqui vemos 11 em ambos os casos. Isso porque
esses três valores aqui são armazenados
no heap apenas uma vez. E então a
matriz de números e o exemplo de Ray vão apenas
apontar para esse valor. Ou seja, temos duas variáveis
separadas que vemos aqui ao
executar seu código, mas os valores são armazenados
apenas uma vez dentro do heap. E isso é uma diferença entre os tipos
primitivo e de referência. Os tipos de referência terão seus valores apenas uma vez no heap com
um ponteiro na pilha. Mas os tipos primitivos
são tão simples que podemos simplesmente armazenar
os valores na pilha. Então posso dizer int
num1 é igual a cinco, int num2 é igual a dez. E então eu vou
chamar uma função add, que fará
aqui em um segundo, e eu vou passar 510. Saindo da nossa
função principal, posso dizer public, static int add, int
num1, int num2. Dentro daqui posso
retornar num1 mais num2. O que vai acontecer aqui
é que quando passamos 510, na
verdade vai
criar mais duas variáveis na pilha chamada num1 e
num2 atribuir os
mesmos valores exatos que os argumentos que estamos
passando aqui. Para provar isso, depois da
nossa função add, vou imprimir num um com uma vírgula e, em seguida, num2. Mas dentro da nossa função add, vou dizer que
num1 é igual a dez. Agora, se eu executar isso, agora
vemos 510. Mas, na verdade,
mudamos um um igual a dez. E, de fato, a soma
da função add. Se eu colocasse isso dentro
de uma declaração impressa, isso vai imprimir 20. Então, se eu executar esse tempo
mais quente com o 20 no console e depois 510, apenas quebre isso
linha por linha caso seja um
confuso para você. Foram primeiro criando
duas variáveis
armazenadas na pilha, 510. Estamos pensando que foi
imprimir a soma, passando 510. Observe como
não estamos mudando num1, num2 em nenhum momento. Isso é importante notar
quando chegamos à linha dez, quando estávamos passando num1
e num2 para o console. Essas duas variáveis
não estão mudando de forma alguma. Uma vez que realmente invocamos
a função add, estamos passando 510, que
criará mais duas variáveis armazenadas em uma pilha. E por acaso apenas
modificamos o primeiro número ou o primeiro argumento
aqui, para o valor de dez. Essencialmente significa
que estamos adicionando dez a qualquer que seja o
segundo argumento, que neste caso é dez, e é por isso que
temos 20 aqui. Agora, a parte importante
aqui é que estamos modificando o primeiro
argumento que foi passado, mas isso tem um número inteiro
novo. Tipos primitivos só
passarão em seu valor. E será basicamente
apenas uma cópia desse valor. Quaisquer modificações
na função não
afetarão isso
na função que
originalmente a chamou. Basicamente, estamos modificando
nosso primeiro argumento aqui. Mas não está modificando nada da nossa função principal. Isso porque esses
são tipos primitivos e apenas o valor é passado. Mas o que acontece se passarmos
em uma matriz de números inteiros? Por exemplo, temos uma
matriz com apenas dois valores. Em vez de num1 e num2, posso dizer que
números int são iguais a 510. Eu poderia então passar em números. E então vou
registrar números índice 0 e números índice um. Agora temos um problema
com a nossa função, pois ela corta esperava dois números inteiros
diferentes. Mas, em vez disso, eu só quero adicionar dois números juntos
de uma matriz numérica, como eu digo int,
colchetes, números. Então eu posso retornar números, índice 0 mais números e X1. ******* execute isso
com shift e F11. Aqui devemos ver alguns
impressos e cada
número individual, como vemos aqui. Mas o que aconteceria se eu
mudar o índice de números 0 a dez, que originalmente é
cinco nesta matriz, tenha em
mente que essa matriz não
está sendo alterada de forma alguma. E estamos passando o primeiro elemento da matriz para este
log do console aqui. Então, se eu executar isso,
agora dizemos que 20 impressos como uma soma Kf estão mudando o primeiro índice
que tem o índice 0, que é cinco, para o
valor de tan aqui. O que significa que estamos basicamente
imprimindo dez mais dez. Mas então o índice de números 0 impresso no console agora
é alterado. Isso ocorre porque a
referência ou o ponteiro para essa matriz é passado como um argumento,
não os
valores reais
em si. Então, quando vamos para Modificar
números índice 0, ele está modificando
a mesma matriz exata que criamos online cinco, porque estamos apenas passando esse ponteiro
que está em uma pilha que apenas aponta para
os valores reais que são armazenados no heap. E essa é uma
diferença importante entre os tipos
primitivos e de referência sempre que você estiver trabalhando
com funções, é importante
saber que quando você modifica algo como um argumento, por exemplo,
números int aqui, que podem ou não
modificá-lo com o resto do programa,
dependendo se é um tipo primitivo ou de referência. Agora, muitos desses conceitos são novos e sei que esse é provavelmente um dos conceitos
mais confusos quando se trata de programação. Se você é novo na programação. Então, se você está tendo
algum problema, sugiro assistir
esta lição
novamente e realmente tentar focar na pilha e na pilha em representações
visuais como
uma explicação de tudo.
30. Noções básicas de programação orientada para objetos: Agora vamos
mergulhar em um conceito conhecido como programação orientada a objetos. E uma forma curta de
dizer isso é aro ou OOP. E é definitivamente
aqui que o Java fica muito mais interessante e podemos realmente construir alguns
programas do mundo real com ele. Mas primeiro, vamos falar sobre o que é programação orientada a objetos? Bem, este é um conceito que não
é exclusivo do Java. Outras linguagens de programação também
têm essa constante. É basicamente
onde podemos representar objetos
do mundo real
dentro do nosso código. E nesses vídeos futuros, vou explicar
o que outras palavras-chave significavam, como classe e estática, e outras palavras-chave que
mencionei que explicarei mais tarde. Vamos dar
uma olhada rapidamente no que uma classe é versus um objeto. A classe basicamente será
o código real que representa o blueprint de
um determinado tipo de funcionalidade ou
determinado tipo de objeto. Agora, quando eu digo blueprint, quero que você pense em
um projeto de Casas. Por exemplo,
se você vir um monte de casas
parecidas entre si, há apenas uma, uma única planta que elas
basicamente copiam e colaram. E cada casa será seu próprio objeto. Uma casa será um objeto ou o projeto será
a classe. Assim, podemos ter uma
mini instâncias de cada classe individual e
essas são conhecidas como objetos. O que realmente usou
este exemplo de casa em
um exemplo de programação real dentro do nosso pacote principal
aqui, posso clicar com o botão direito do mouse. Posso ir para a classe New e, em seguida,
Java dentro aqui. Vou nomear esta casa, mas vou usar
uma notação de caso Pascal, basicamente significando
que nós capitalizamos a primeira letra
de cada palavra. Se eu tivesse exemplo de casa, tanto o H quanto o E
seriam capitalizados. Mas neste caso eu só quero
creditar a classe chamada house. Vá em frente e pressione Enter e ele deve abrir automaticamente. E agora, dentro dessa classe
ou dentro desse blueprint, podemos adicionar
várias propriedades. Agora, o que é uma propriedade? Essas são basicamente variáveis
e métodos que são especificamente definidos
dentro dessa classe de casa. E isso nos ajuda a acessar valores
diferentes ou trabalhar com diferentes funcionalidades dentro
do contexto de uma casa. Mergulhar em muito mais detalhes
sobre o que realmente
entraria em uma aula
de casa nos próximos vídeos. Mas primeiro, vamos
dar uma
olhada rápida em como essa classe doméstica pode realmente ser usada dentro da
nossa classe principal aqui. Vou seguir em frente e excluir
alguns desses comentários. Agora posso dizer casa
com um H. maiúsculo E aqui vemos que ele
vai tentar importar do nosso sistema de arquivos
local. Posso ir em frente e pressionar Enter, e então aqui podemos ir em
frente e nomear nossa variável. Neste caso, direi
casa com uma h minúscula, vou nos atribuir
igual a uma nova casa. Agora, a nova palavra-chave faz parte da programação e das classes
orientadas a objetos, mas os detalhes disso
serão explicados posteriormente. Por enquanto, podemos pensar nisso como basicamente apenas
tendo uma nova casa, uma aula de casa bem aqui. Este vai
ser o plano, mas agora criamos uma instância real da nossa casa. Vamos dar um exemplo muito simples fazendo com que a casa
imprima helloworld. Posso dizer vazio público. E observe como
não temos estática aqui. Vou explicar a
diferença entre métodos
estáticos e não estáticos em alguns vídeos. Mas, por enquanto, não inclua
estática neste exemplo. Tão público, vazio, impresso. E então eu não vou
ter parâmetros. Eu simplesmente vou
imprimir o hello world no console. Agora, se eu passar o mouse sobre isso, veremos que as
impressões do método nunca são usadas. Vamos seguir em frente e tentar usá-lo. Voltando à nossa classe principal aqui temos acesso
a esta casa. Posso dizer que a Câmara pressiona um período. Isso terá
uma lista suspensa com todas as propriedades e
métodos disponíveis que podemos acessar. Nesse caso, temos acesso
à nossa função de impressão. Posso ir em frente e pressionar Enter, e vou executar isso. E aqui vemos o Hello
World no console. Vou prosseguir e
renomear essa variável. Posso clicar em qualquer lugar
dentro do nome da variável, e posso segurar Shift e
pressionar F6 ao mesmo tempo. Agora podemos ir em frente
e mudar isso. Vou mudar esse nome para minha casa com um
H maiúsculo e m minúsculo. Agora, vou criar
uma nova variável. Como eu disse, casa. Sua
casa é igual a uma nova casa. E essas duas variáveis
não têm nada em comum além do fato de terem sido
criadas com a mesma classe. Basicamente, eles são
vizinhos um do outro, mas não são a mesma casa. Se seu vizinho tem uma casa
semelhante à sua, não significa que
seja sua casa. Se apenas uma casa semelhante baseada
no mesmo projeto. Por exemplo, posso dizer a impressão de pontos da
sua casa. E eu posso ir em frente e executar isso. E agora vamos
ver duas instâncias do HelloWorld e do nosso console,
como vemos aqui. Este é o
básico das classes e como criar objetos
em torno dessas classes. E nos próximos vídeos, vamos
mergulhar muito mais na
programação orientada a objetos, onde podemos criar um objeto de casa
funcional que realmente representa um real casa dentro de
nossos programas.
31. Construções: Agora vamos falar sobre um conceito chamado construtores, que basicamente será
apenas um método interno
em todas as classes executadas ou invocadas sempre que uma nova instância dessa
classe for
criado. Na verdade, existe um construtor
padrão em cada classe. Se criamos um
nós mesmos ou não, ele terá
automaticamente um. Então, um construtor,
veremos algo como um método, mas um pouco diferente
porque ele não teria um tipo de retorno, como o vazio aqui. E também o nome do
construtor deve ser o nome exato da classe. Então posso dizer
casa pública com uma capital H. Isso agora é conhecido
como nosso construtor. Para provar isso,
vou imprimir uma nova casa foi feita. E vou executar
isso em nosso console. Aqui vemos que uma nova casa foi
feita porque criamos uma nova instância da nossa classe de
casa
aqui como a variável minha casa. E isso fez com que
o construtor fosse executado dentro da
nossa impressão hello world. Mas então estamos criando
outra casa, que significa que o outro
construtor é rampa. E então, claro, estamos
imprimindo hello world novamente. Agora, um construtor
não pode retornar nada, mas não pode usar parâmetros
diferentes. Por exemplo, posso ter o nome do proprietário da
string. Então posso dizer que uma
nova casa foi feita. O proprietário é como um
adicionar no nome do proprietário. Agora temos dois
problemas relacionados aqui. Isso porque,
de volta à nossa classe principal, não
estamos passando
nenhum argumento. Então, por exemplo
, aqui ele pode passar por um Alex. Claro que você pode adicionar
seu próprio nome. E aqui vou
passar no Bob. Claro que você pode adicionar
qualquer outro nome que quiser. Então, se eu executar isso, agora podemos
dar uma olhada no nosso console. E aqui vemos que uma
nova casa foi feita. O dono é Alex. E isso porque
criamos uma nova instância de uma classe de casa aqui. E passamos um ALEKS como uma
string para o nosso construtor. E então, claro, quando
criamos uma casa de Bob, vemos que o dono é
Bob e o console. Agora, semelhante aos métodos, os construtores podem ser substituídos, para que possamos passar
diferentes tipos de valores para os parâmetros. Como eu disse, casa pública. Eu não poderia dizer andares. Aqui, eu poderia imprimir uma
nova casa foi feita. Tem que eu posso adicionar nos pisos e isso pode adicionar
nos pisos de cordas. E também vou colocar
parênteses ao redor do S porque podemos passar em
uma única casa de história. Então agora temos dois construtores
diferentes, e estes serão
executados em momentos diferentes. Por exemplo, backup da casa de Bob. Em vez de passar por Bob, vou fazer desta
uma casa de dois andares. Você pode notar que
automaticamente o IntelliJ VAI notar que este agora será
o parâmetro de pisos. Este não vai ser o dono chamado como diz aqui. Isso porque ele entende
que estamos substituindo o construtor para passar em dois
tipos diferentes de variáveis. E aqui estamos
passando um número inteiro. Então isso significa que
vamos usar esse construtor aqui. Então, agora, se eu executar isso e se
olharmos para o nosso console, agora vemos
que a primeira instância da nossa casa
vai ser impressa. O dono é Alex. Mas a segunda instância
da nossa casa
vai imprimir
um tem dois andares. Isso porque estamos usando o tipo diferente de construtor que passa
somente para números inteiros. Agora, neste exemplo, acabamos de
imprimir algum texto, mas em casos de uso reais, que vamos dar uma
olhada em alguns vídeos. Vamos
basicamente usá-los como funções de configuração para garantir que todo o resto esteja
configurado e
funcionará corretamente para que nossa
casa funcione.
32. A palavra de chave e propriedades: Agora vamos ver
essa palavra-chave, bem
como criar propriedades
diferentes
que basicamente serão apenas variáveis
dentro da nossa classe. Vou me livrar
desses comentários aqui. E também vou me livrar
dessas declarações impressas
dentro de nossos dois construtores. Agora, dentro da nossa classe, mas fora das funções, vou criar algumas
variáveis diferentes. Por exemplo, eu poderia dizer string
privada com um S
maiúsculo, nome do proprietário. Eu não poderia dizer int andares
privados. E a parte privada disso, assim
como o público em alguns
desses métodos serão explicados em um vídeo futuro. Agora já demonstrei como podemos sobrecarregar
os construtores. Mas neste caso,
queremos apenas um único construtor com ambas as
informações sendo transmitidas. Aqui posso dizer int andares. E agora dentro disso, vou querer atribuir
o novo nome de proprietário e os novos andares
dos parâmetros para nossas variáveis locais. Como essas duas
variáveis aqui são variáveis
diferentes,
nossos parâmetros aqui. Mas antes de fazer isso, temos dois problemas relacionados
porque se eu voltar, agora
estamos usando
sintaxe incorreta para um construtor. Aqui, digamos que minha
casa tenha duas histórias, a menos que diga que esta
ainda é uma casa de Bob, que é claro que você pode usar
qualquer corda que quiser nelas, mas também são duas histórias. Então, voltando para
a aula da casa, não
temos mais problemas. Mas como vamos
definir o nome do proprietário on-line para igual ao parâmetro
que está sendo passado. Por causa, claro, eles são
o mesmo nome exato. Dizer que o nome do
proprietário é igual ao nome do proprietário
realmente não faz nada. Na verdade, ele não modifica a
linha para qualquer coisa, porque isso
fará referência
à variável mais local no escopo, que neste caso
será apenas o parâmetro sob
nome aqui. Agora, tecnicamente, poderíamos alterar os nomes
dessas variáveis, então elas não são exatamente as mesmas, mas essa não é a solução
mais correta. A
solução mais correta
diria apenas que esse nome do proprietário do ponto é igual ao nome do proprietário e esse andar de
ponto é igual a força. O que realmente está acontecendo aqui? Bem, isso representa
o objeto atual. Sempre que este construtor
é dirigido para minha casa, que tem o nome
de proprietário de Alex e dois andares. A, esta palavra-chave
aqui vai fazer
referência ao objeto da minha casa aqui. Quando estamos criando a casa de Bob, esse objeto
aqui vai fazer referência ao objeto da sua
casa aqui. A palavra-chave, this
aqui vai representar o objeto atual que está
sendo usado para essa classe. Para provar isso dentro da
nossa função de impressão, posso dizer que esta
casa é de propriedade. Eu poderia então imprimir
esse nome de dono do ponto. E tem mais essa força de pisos de
pontos. Claro, vou colocar parênteses
ao redor do S,
caso você queira passar em
uma única casa. Agora ainda estamos usando
essa função de impressão, como você pode ver aqui. Vou seguir em frente
e executar este programa. E aqui vemos que
nesta casa é de propriedade de Alex e tem dois andares. Também vemos que esta casa era de propriedade de Bob e tem dois andares. Os nomes e o
número de andares serão salvos
localmente. Bem aqui. Não estamos acessando
os parâmetros que adicionamos aqui, porque eles são
devolvidos que só são
acessados dentro do escopo do
construtor. Então, basicamente, temos
nossos próprios parâmetros ou nossas próprias variáveis
dentro dessa classe. Estamos atribuindo
esses sempre que estamos criando o objeto a
partir do construtor. E então podemos acessar
essas variáveis em qualquer lugar dessa classe. Por exemplo, dentro
dessa função de impressão,
dizendo o
nome do proprietário do ponto e essas guerras de coisas. Agora, tecnicamente
neste caso de uso para a função de impressão, a palavra-chave, this é opcional
porque, por padrão, ela
assumirá que vamos usar
a instância atual
da classe. Então eu posso ir em frente
e excluí-los. E se eu executar isso de
novo,
vai funcionar da mesma forma. Agora, tecnicamente, isso não é uma boa prática porque
dizer this.name e desktops deixa
bem claro que estamos tentando acessar variáveis
armazenadas na classe, mas é tecnicamente opcional neste caso da função
printf. Mas nosso construtor tem que
ser necessário porque eles têm os
mesmos nomes de variáveis exatos que nosso parâmetro. Para ser muito claro, quais valores estamos
atribuindo, quais variáveis. Podemos dizer esse
ponto no nome dela para fazer
referência à nossa string
privada local aqui. E este ponto andares
que fazem referência nosso número inteiro privado local aqui. E, em seguida, atribua-os ao nome do
proprietário no perímetro. E o parâmetro pisos.
33. Encapsulamento, abstrato, Getters e setters: Mergulhando ainda mais na programação
orientada a objetos, agora
vamos
introduzir mais dois conceitos que ficarão
um pouco mais confusos, mas espero que eu possa explicá-los bem o suficiente
para você entender. Esses dois conceitos serão conhecidos como encapsulamento,
bem como obstração. Mas também estamos dando uma
olhada em getters e setters, que são um
exemplo de abstração. O encapsulamento
basicamente
será um conceito de programação
orientada a objetos onde queremos que todas as
nossas funcionalidades sejam encapsuladas em
um único lugar. E até mesmo uma classe em
si é um exemplo
de encapsulamento. Por exemplo, aqui
temos uma aula de casa. Então, qualquer funcionalidade que teremos em relação
a uma casa, como quantas portas tem, quantos andares ela tem, janelas e quartos
diferentes
e outras coisas assim. Basicamente, qualquer coisa a ver
com uma casa deve ser fechada ou encapsulada
dentro desta classe da casa. Agora, outro conceito é algo como algum medicamento
ou uma pílula onde você tem toda a funcionalidade encapsulada dentro
de uma única pílula. Isso significa que os usuários
dessa classe ou as pessoas que
tomam o remédio, não precisam necessariamente saber o funcionamento interno, tudo. Eles só precisam ver
o objeto externo e saber que tudo está
encapsulado por dentro. Isso é mais um
conceito que
realmente não pode ser demonstrado
de forma clara, mas é algo
que é importante entender que, ao
escrever seu próprio código Java, você quer que tudo seja capsulado dentro
de sua própria classe. Agora, o próximo conceito
é abstração, que é ligeiramente semelhante
ao encapsulamento. Mas, basicamente, isso
significa que você só quer que o usuário que está usando a classe
tenha acesso às coisas que realmente
precisam. Por exemplo, vou alterar essas propriedades privadas
aqui para público. E vou explicar o que privado versus público neste vídeo. Mas, por enquanto, basta acompanhar e mudar isso para público. E agora dentro do nosso arquivo principal, depois de criar a primeira casa, mas antes de imprimi-la, posso dizer o ponto da minha casa. Agora, aqui temos acesso a todas as propriedades e
métodos dessa classe. E podemos ver o
nome do proprietário e os andares. Posso mudar o nome do
proprietário para Bob. Digamos que Bob sequestre
minha casa, por exemplo. E se eu executar isso, agora
vemos Bob duas vezes no causal, como vemos aqui. Agora, essa é tecnicamente
uma má prática. E vou
mudar essas variáveis de
volta para privadas
usando o Control Z ou o
Command Z em um Mac. E agora vemos um problema
relacionado. Se eu passar o mouse sobre isso aqui, ele diz que o nome do proprietário tem um acesso privado dentro da casa de pontos com ponto
desgastado. Então, vou remover essa
linha de código aqui. E agora não podemos acessar
diretamente quem é
dono da casa sem realmente
estar dentro da casa. Por exemplo, eu poderia dizer que
esse nome de ponto é igual a Bob, e isso funcionaria muito bem. E isso porque a
propriedade privada aqui é algo conhecido como modificador
de acesso. Isso
restringirá o acesso que certas coisas têm
quando se trata de propriedades
e métodos
diferentes. Um método privado ou
propriedade privada, nesse caso, significará que a
única coisa que pode acessar isso são coisas dentro
da mesma classe exata. É por isso que podemos
acessá-lo
aqui , bem como aqui. Mesmo sendo privado, ainda
estamos dentro da classe. É também por isso que tivemos
o erro aqui. O que estou tentando
acessá-lo porque não
estamos dentro da aula
da casa. Estamos dentro da aula do curso
Warnock keys ou qualquer que você
nomeou sua classe. Agora, público, como você provavelmente
pode imaginar, significa que qualquer coisa pode
acessá-lo acessando seu próprio objeto. Por exemplo, temos
uma impressão vazia pública. Esse método é público, o que significa que se tivermos um
objeto para essa classe, por exemplo, minha
casa ou sua casa, poderemos acessar o método de
impressão nele. Agora você pode estar
se perguntando por que não acessar
diretamente o que
quisermos. Por que restringir certos acessos? Bem, esse é
todo o conceito por trás da
abstração,
basicamente vai levar toda a funcionalidade interna
e como a casa funciona e apenas lhe dar acesso ao que é necessário para
a Casa realizar seu trabalho. Agora, em algumas situações, você pode dar acesso interno a certas coisas usando
getters e setters, que vamos dar uma
olhada aqui em um momento. Mas, normalmente, como uma
boa regra geral, você só deve dar acesso ao que é absolutamente necessário. E você nunca deve
dar acesso direto a variáveis diretamente como essa. Em vez disso, você sempre deve
usar getters e setters. Vamos dar uma olhada rápida
em como isso funciona. Posso dizer público, string get. Agora aqui ele vai
preencher automaticamente o conceito de obter nome do proprietário, que é realmente o que
eu vou usar aqui. A razão pela qual eu sabia disso é porque ele vai
retornar uma string. E sempre que eu digito
Git, ele vai
presumir que estão criando algo conhecido como
método getter. Basicamente, esse é
apenas um método que retorna uma propriedade privada. Nesse caso, posso
devolver o nome do proprietário. Agora eu posso realmente
acessar o nome do proprietário que é privado a partir
desse método getter. Também temos métodos setter, que é um conceito semelhante, mas obviamente
não estamos recebendo o valor. Em vez disso, estamos estudando
o valor, como eu digo, vazio
público porque
não estamos devolvendo nada. Defina o nome do proprietário aqui. Ele terá
um parâmetro. Posso dizer o nome do proprietário da string. E então, dentro disso, posso dizer que esse nome do proprietário do ponto
é igual ao nome do proprietário. Agora, se eu quisesse, eu posso realmente ir
até minha casa, como eu disse, meu nome de dono do conjunto de pontos de casa. Posso passar por Joe. E se eu executar isso, vamos ver
Joe e Bob no console. E, na verdade, vemos
Bob duas vezes por causa do erro que cometi aqui
na função de impressão. Como exemplo, eu disse que
podemos usar isso aqui. Vou seguir em frente
e excluir isso
e , em seguida, executar o
programa mais uma vez. E agora vemos Joe e
Bob no console. Este é um exemplo de um método
getter e
um método setter. Agora você pode estar
se perguntando por que se preocupar com qualquer um desses
getters e setters. Por que não remover completamente essas funções aqui e apenas
tornar nossas propriedades públicas? Quando eu estava aprendendo programação orientada a
objetos pela primeira vez, eu teria a
mesma pergunta exata e fiquei muito confuso. Por que todo esse trabalho extra e apenas para os
mesmos resultados exatos. Mas, à medida que escrevi
mais e mais código ao longo dos anos, percebi que usar getters
e setters é muito mais conveniente e torna
as coisas muito mais organizadas. Por exemplo, imagine
que temos um projeto muito grande
com dezenas de casas. Oliver, nosso projeto,
e queremos mudar todos os nomes dos proprietários para,
digamos maiúsculas. Ou queremos registrar
todos os nomes dos proprietários sempre que forem alterados
ou algo assim. Quero executar algum tipo de funcionalidade sempre que o nome do
proprietário for alterado. Por exemplo, aqui podemos dizer que esse nome de proprietário é igual ao nome do
proprietário ponto ToupperCase. E para tornar as coisas
ainda mais convenientes, podemos alterar uma linha dez
aqui deste nome de proprietário é igual a nome para definir o nome do proprietário. Passando o nome do proprietário. Isso fará com que
o construtor padrão também
o faça com que
seja maiúscula. Se eu executar isso, devemos ver ambos em nossos nomes e maiúsculas. E se tivéssemos tudo definido para público sem nenhum
getters ou setters, e tivéssemos dezenas de casas
em um projeto maior, teríamos que
passar e
mudar manualmente todos os nossos
nomes para maiúsculas, o que parece muito tedioso
e muito irritante. Mas porque usamos
as regras corretas de abstração e
usamos getters e setters com
propriedades privadas aqui em cima. Agora temos a capacidade de
alterar facilmente certos aspectos do nosso programa a partir de uma única
mudança aqui.
34. Herança: Vamos dar uma olhada em algo
conhecido como herança. É basicamente
onde podemos adicionar ou estender outra classe para
dar mais funcionalidade. Por exemplo, posso criar uma nova classe Java e
vou ligar para este hotel. E vou estender a casa. Como eu disse, estende a casa. O que isso significa é
que ele herdará todas as funcionalidades
dentro da classe doméstica. Mas então podemos adicionar mais
funcionalidade e lado. Por exemplo, agora podemos especificar uma metragem quadrada lobista, ou o número de funcionários,
coisas assim,
que o hotel tem uma
casa não tem, mas uma casa ainda vai
ter um proprietário e um certo número de andares
que um hotel também tem. Em vez de fazer uma aula de hotel, que teria essas
propriedades dentro, vamos estender a casa que já possui
essas propriedades. Dessa forma, não temos que
realmente fazê-los novamente. Mas estamos recebendo
esse erro aqui. Se eu passar o mouse sobre
ele, ele diz que não
há construtor padrão disponível. Se formos até a casa, vemos que não há construtor
padrão, que
significa que não
havia construtor que tenha 0 parâmetros. Então, temos esses dois
parâmetros aqui, o nome do proprietário e os andares. E isso significa que nosso hotel, que se estende de casa, também tem que ter um construtor
semelhante. Então eu posso dizer público, hotel,
string, nome do proprietário
e, em seguida, int floors. Agora recebemos outro erro. Se eu passar o mouse sobre isso, ele diz que não
há
construtor padrão disponível. Isso significa que
temos que usar algo conhecido como o super método. Então, se eu chamar super-heróis, eu poderia passar
o nome do proprietário e os andares. E a super função
só será usada dentro de classes que
estendem outra classe. Isso basicamente
chamará o construtor
da classe que estamos estendendo
neste caso de casa. Então, agora criamos
um construtor de hotéis. Isso vai
chamar um construtor do construtor da casa. Portanto, vamos
definir as propriedades privadas do nome
do proprietário e dos andares iguais às propriedades que
estamos passando. Nesse caso,
simplesmente vamos
passar por eles e do construtor
do hotel. Agora, se isso parecer
confuso, não se preocupe, vamos fazer
uma nova instância de hotel, e isso fará muito
mais sentido depois disso. Aqui na nossa classe principal, vou dizer hotel. Meu hotel é igual a um novo hotel. Podemos então passar o dono. E então a quantidade de
andares, digamos dez. Agora posso imprimir meu ponto do
hotel recebe o nome do proprietário. Mas dentro da classe do hotel, não
temos um nome de
proprietário. Isso porque ainda estamos
estendendo a classe house, herda toda a
funcionalidade anterior dentro
dessa classe. Por exemplo, obtenha o nome do proprietário. Então, é claro que se eu
fosse executar
isso, simplesmente imprimirá
Alex no console. Não vou aborrecê-lo
com esse conceito simples. Tenho certeza que você entende isso. Mas vamos nos aprofundar em como esses construtores funcionam e
como o super método funciona. Basicamente, estou passando
ALEKS e estanho como parâmetros para o construtor do
hotel. Portanto, o
nome do proprietário e os andares
serão Alex e dez chamaram
super, que
chamará o construtor da classe estendida. Nesse caso, isso é casa. Essencialmente, vamos
chamar essa função aqui, que as definirá para propriedades
privadas
iguais a Alex e dez. Agora podemos acessá-los
dentro do hotel se forem públicos ou algo
conhecido como protegido. Então, até agora vimos
privado e público. Havia também
outro que está protegido. Por exemplo, dentro
do construtor. Não consigo imprimir
esse nome de proprietário. Vemos no menu suspenso aqui, não
há opção. E também se eu deixar
assim , vamos
receber um erro. Se eu passar o mouse sobre isso, ele diz que o nome do proprietário tem acesso privado. Isso porque o acesso
privado significa que as únicas coisas diretamente
nessa classe podem acessá-lo. Não necessariamente coisas
que estendem essa classe. Se quiséssemos que
as classes que se estendem acessassem, podemos mudar de privado
para protegê-lo. Agora, o erro desaparece e protegê-lo basicamente
significa que qualquer coisa dentro da classe pode
usá-lo, bem como
todas as classes que estendam
essa classe podem usá-lo.
35. Polimorfismo: Vamos agora falar sobre um conceito
conhecido como polimorfismo. Isso é basicamente algo
que significa muitas formas porque poli significa muitos
e morfismo significa formas. Para dar uma olhada no problema
que o polimorfismo resolve. Aqui temos o objeto do meu
hotel, bem como
o objeto da sua casa
e o objeto da minha casa. Esses dois estão usando
a função de impressão. E como o hotel
estende a casa, agora
temos acesso
à função de impressão. Posso dizer a impressão de pontos do meu hotel. Agora, se eu executar isso, vemos que as casas de propriedade de cada pessoa e
tem tantos andares. O hotel ainda
diz que as casas possuíam. Queremos basicamente substituir a funcionalidade exata
da função de impressão
dentro da classe do hotel. Para fazer isso, vamos dar uma olhada
na aula da casa rapidamente. Nossa impressão funciona
como impressão vazia pública. Nossa classe de hotel precisa ter
a mesma função exata. Posso dizer público, vazio, impresso. E agora, para simplificar, vou simplesmente copiar e colar a linha
anterior aqui. Posso usar o Control C no
Windows ou o Command C no Mac. E então eu posso ir em frente e usar o controle V no Windows
ou no Command V no Mac. Agora recebemos um erro porque essas duas propriedades são privadas e
não estão protegidas. Então eu preciso usar seus getters
correspondentes. Então eu poderia dizer Obter o nome do dono. Ainda não temos um presente
para o método dele. Então, se eu disser git floors, na
verdade não existe. Além disso, vá em frente e faça um. Deve ser bem simples, eu acho que um público int
obter Flores dentro aqui, eu posso simplesmente retornar falso. Então agora temos um getter
que podemos usar. Dentro do hotel. Não
temos mais um erro aqui. Podemos mudar. A casa é de propriedade de dois, o hotel é imparcial. Agora, se eu executar isso e
olharmos para o nosso console, aqui vemos que o hotel é de
propriedade de Alex e
tem dez andares, ou os
objetos da casa anterior ainda dizem casa. Isto é o que é o polimorfismo, que temos muitas formas
da mesma função exata. Então aqui temos uma
função de impressão em nossa casa, e aqui temos uma
função printf em nosso hotel. Sempre que estamos tentando
acessar uma função de impressão, sempre
usaremos a mais próxima da classe exata. Por exemplo, agora que temos essa função printf,
ela usará isso. Mas, de antemão,
não o tinha. Então, ele olharia para a
classe da casa que estamos estendendo. E, claro, house
tinha uma função printf. Então, ele usaria isso. Agora, isso também é conhecido como um conceito de substituição de métodos. Agora, isso não deve ser
confundido com a sobrecarga de
métodos. É aqui que temos dois
métodos com o mesmo nome exato, mas talvez
parâmetros diferentes. Por exemplo, posso
dizer público, vazio, impresso e, como argumento,
posso dizer int times. Aqui vou
percorrer uma certa quantidade de vezes, dependendo de
quantas vezes forem passadas. Posso dizer para int a igual a 0, enquanto a é menor que
vezes mais a. Agora dentro daqui eu poderia simplesmente copiar e colar esta
linha aqui, ou simplesmente posso
chamar a função de impressão. Então, agora voltando
para a nossa classe principal, estamos simplesmente imprimindo isso, mas também podemos dizer a impressão de
pontos do meu hotel e passar em cinco. E agora eu posso executar isso. E aqui vemos que ele é impresso
cinco vezes diferentes. Agora, é claro, vemos
cinco vezes aqui. Mas também temos essa
sexta vez no topo. E isso é porque
aqui estamos dizendo impressão de pontos do
meu hotel sem
nenhum argumento real. Portanto, ele
usará a função printf normal que criamos. Agora já
ultrapassamos a sobrecarga do método. Isso não é realmente uma atualização. Isso é apenas para
esclarecer que a
substituição do método é
diferente da sobrecarga do método. Obviamente, eles podem ficar confusos porque há palavras semelhantes, mas são
conceitos diferentes, como você pode ver aqui.
36. A palavra chave "estático": Até agora, temos
propriedades diferentes dentro de nossas classes, por exemplo,
nome do proprietário e andares. E eles estarão
vinculados a cada objeto individual
que criamos. Por exemplo, minha casa, sua casa e meu hotel. Não vou
apresentar uma nova palavra-chave, que é a palavra-chave estática, que você pode ver aqui. Isso basicamente
não vinculará as propriedades aos objetos
individuais, mas sim laços de propriedades
com a própria classe. Agora, cada
casa é diferente, então é difícil para mim descrever um exemplo estático quando se
trata de casas. Então, vamos
usar pássaros em vez disso. Posso clicar com o botão direito em
nova classe Java. E vou
nomear isso como um pássaro. Agora vamos dizer que cada pássaro terá seu próprio nome. Então eu posso dizer tipo de
string privada. E então aqui posso dizer pássaro
público em um construtor, podemos ter uma string
aqui chamada tipo. E então, dentro do
construtor, podemos atribuir o tipo de variável local igual
aos parâmetros passados
do construtor. Aqui posso dizer que esse tipo de
ponto é igual ao tipo. Tudo parece
bastante básico até agora, vamos para minha classe principal e vou comentar isso. Vamos descomentá-los em vídeos
futuros quando
voltarmos ao exemplo da casa. Mas, novamente, a estática é muito
mais fácil de entender e para mim explicar
sem usar casas. Aqui posso dizer pássaro,
pássaro é igual a pássaro novo. Tenho acesso a um pássaro, mas agora tenho o passe
em um determinado tipo. Por exemplo, posso
passar um corvo, e agora temos
acesso a um pássaro. Tudo parece bastante
padrão até agora. Agora, propriedades estáticas,
como variáveis e métodos, entram quando você quiser saltar
algo para a própria classe. Como mencionei, a casa tem o nome do proprietário
e os pisos que estão ligados a cada objeto individual criado a partir desta classe de casa. Então, em nosso arquivo principal
aqui temos minha casa, que vai tê-la em propriedades do
nome do proprietário e andares. E então sua casa
terá propriedades diferentes, também chamadas de
nome e pisos mais antigos. E meu hotel tinha a mesma coisa porque isso está estendendo
a classe da casa. Mas se eu entrar no pássaro aqui, posso criar algo
conhecido como variável estática. Como eu digo, público, estático, int wings é igual a dois. Agora, se eu voltar ao
meu arquivo principal aqui, quando vou acessar as asas de pássaros, vemos que não existe
na verdade. Isso porque, novamente,
as variáveis estáticas
não estão ligadas ao próprio pássaro de
objetos. O objeto é esse objeto
que criamos aqui. Em vez disso, eles estão vinculados
à classe real. Então asas de pássaros. Então agora, se eu executar isso, vamos ver a quantidade de asas nesta casa de pássaros. Neste caso, são dois. Mas por que usar estática aqui em vez de apenas criar
uma variável normal? Vamos porque isso só é
criado uma única vez. E caso contrário, por
exemplo, com o tipo de string, essa variável aqui
é criada toda vez que criamos uma nova instância
da nossa classe Bird. Voltando ao exemplo da casa, temos três
instâncias diferentes de nome e
andares do proprietário porque não temos três objetos diferentes
que os usarão. Mas se eu tivesse três pássaros
diferentes, ainda
teríamos apenas
um inteiro chamado asas. Portanto, variáveis estáticas como esta aqui
serão usadas sempre que você tiver uma classe que tenha uma informação
compartilhada. Então, por exemplo, aqui os pássaros têm duas asas e isso
nunca vai mudar. Ter isso como
variáveis locais, como asas int
privadas é igual a duas. Não faz muito sentido porque isso nunca
vai mudar. Portanto,
não precisamos ter
uma variável de asas amarrada a cada
objeto individual que criamos. Em vez disso, podemos apenas
vinculá-lo diretamente à classe. Agora também podemos ter métodos
estáticos. Posso dizer público, estático,
int, obter asas, por exemplo. Aqui podemos
simplesmente retornar asas. Agora, geralmente, métodos estáticos só serão usados
sempre que você estiver
tentando acessar ou usar
variáveis estáticas ou algum tipo de funcionalidade ou retornar coisas como um simples
getter aqui. Agora, na minha classe principal, não
consigo imprimir o ponto de
pássaro obter asas. E é claro que isso
terá o mesmo resultado porque estamos simplesmente
retornando a mesma variável, mas semelhante à variável ponto de
pássaro obter asas não existe na verdade. Porque, novamente, propriedades estáticas e métodos estáticos estão
vinculados à classe, não vinculados ao objeto
criado a partir da classe.
37. Aulas abstratas: Até agora, demos uma
olhada nas aulas normais, como nossa casa, nosso pássaro e nossas aulas de hotel. Mas agora vamos
dar uma olhada em algo conhecido como aulas abstratas. Este é um
tipo diferente de classe que não podemos usar diretamente. Por exemplo, se eu for
à minha aula de pássaros e eu fizer disso uma aula
abstrata pública, nada acontece diretamente aqui. Tudo parece normal. Mas se voltarmos
ao nosso arquivo principal, aqui teremos um erro
porque não podemos usar
diretamente classes abstratas. Essas são classes
projetadas para
serem usadas somente com classes
que as estendem. Por exemplo, aqui posso fazer uma nova aula e vou
chamar isso de corvo. Isso vai
estender a classe de pássaros. Estende Bird. E agora temos que criar
nosso próprio construtor porque temos um
construtor não padrão aqui. Então posso dizer que público cresce o parâmetro sendo
o mesmo exato que o pássaro. Então, tipo de string, como
podemos ver aqui, voltando para a nossa classe CHRO, podemos chamar essa super
função passando no tipo. Agora todas as flechas
devem desaparecer. Se voltarmos à
nossa classe principal. E em vez de usar o
pássaro diretamente, agora
vou dizer cro, gro é igual a um novo CRO. Agora temos acesso a isso e tínhamos isso ainda
passar em uma string. Nesse caso,
passaremos o nome do Corvo. E isso tecnicamente é um pássaro
porque cro estende Bird. Mas por que você gostaria de ter uma aula abstrata que
precisa ser estendida? Não podemos usar isso diretamente. Bem, é aí que entra
o conceito de funções
abstratas. Então, por exemplo, aqui posso
dizer abstrato público, vazio. Posso chamar isso de Singh. E não vou
incluir nenhum corpo de função. Se eu fosse fazer isso,
teremos um erro. Se eu passar o mouse sobre isso
e agora ele diz que métodos
abstratos
não podem ter um penico. Então aqui
vou criar
a declaração de uma função, mas não há corpo
ligado a ela. Agora cada classe se estendeu, a classe de pássaros é forçada a
estender essa função sinc. Se eu voltar para um corvo,
aqui teremos um erro. Se eu passar o mouse sobre ele, ele diz que
a classe Crow deve ser declarada abstrata ou implementar
os métodos abstratos. Vendo em bert aqui posso
dizer público, vazio, cantar. Eu posso então imprimir um som
que um corvo pode fazer. Por exemplo, isso. Agora, se eu voltar
ao meu arquivo principal, agora
posso dizer Crow dot sin. E se eu executar isso,
veremos que isso
imprimimos no console. Agora vamos dizer que eu tenho
outra aula aqui. Vou chamar isso de Robin. Eu posso ter esse pássaro estendido. Assim, podemos criar nosso
próprio construtor. Então, público Robin, tipo de string. Então podemos passar neste dois são super método que
chamaremos de construtor de pássaro. Agora ainda temos que substituir
o método toString. Vazio público, cante. Aqui vou imprimir
tweet, tweet. E agora eu posso fazer uma
instância robin dizendo Robin, Robin é igual a novo robin, passando Robin aqui. E então agora posso
dizer Robin dot sin. Se eu executar isso,
veremos os dois sons diferentes
que os pássaros farão. E isso é útil porque a classe de pássaros é
uma classe abstrata, o que significa que ela tem muita configuração, mas não deve ser usada diretamente. Ele deve ser usado
com outras classes que terão uma funcionalidade
específica. Por exemplo, cada pássaro pode fazer um ruído ligeiramente diferente. Por isso, queremos
forçar cada tipo de ave a implementar essa
funcionalidade diretamente.
38. Interfaces: Vamos agora dar uma
olhada nas interfaces, que têm alguns
conceitos semelhantes às classes abstratas, que só
precisariam olhar. Mas eles têm algumas diferenças
importantes. Por exemplo, aqui temos
uma classe abstrata de pássaros. E as classes
abstratas normalmente têm
coisas normais dentro das classes, por exemplo,
métodos e variáveis diferentes. No entanto, também
geralmente teremos uma função abstrata
que qualquer classe que estenda a classe pássaro
é forçada a implementar. Nós demos uma olhada
nisso no último vídeo com nossa aula de CRO e Robin, onde precisamos agora
substituir o método de cantar. Agora, uma coisa a
ter em mente é que cada classe em Java só pode estender
uma outra classe, mas podemos usar quantas
interfaces quisermos. Por exemplo, aqui no meu projeto, vou criar
uma nova classe Java. E vou mudar isso
para uma interface aqui. E vou
nomear esse animal. Agora, dentro deste animal, não
podemos ter um construtor, por exemplo, animal público. Isso causará um erro. Os únicos métodos que podemos ter aqui são métodos abstratos. Digamos que eu queira que minha classe Robin e Cro implemente
essa interface animal. Isso também significará que todos os animais que eu faço no futuro, sejam vacas, cães,
cobras , qualquer coisa
terá que implementar isso. Portanto, isso só deve
conter coisas específicas para qualquer animal, digamos, público int, vida útil
média. E, novamente, esses serão
métodos abstratos. Portanto, não posso escrever um corpo de função
real aqui porque, novamente,
esta é uma interface. Só podemos ter
funções sozinhas. Mas se eu entrar em micro classe, por exemplo, posso fazer
isso implementos animais. Agora recebemos um erro. Se eu passar o mouse sobre isso, diz que a
classe Crow deve ser declarada abstrata ou implementar o método abstrato
vida útil média em animais. Aqui posso dizer público
int vida útil média. E isso vai
retornar oito. Agora não recebemos mais
um erro em nenhum lugar. Vou ao meu Robin, agora
posso dizer implementos animal. Teríamos que fazer exatamente a
mesma coisa. Public int, vida útil média. Aqui eu posso voltar. Agora posso voltar ao
meu arquivo principal e posso imprimir a vida útil
média do ponto de crescimento, e posso imprimir a vida útil média do robin
dot. Por correr, vamos
ver 82, respectivamente. E você pode estar pensando que podemos alcançar esse mesmo conceito
exato com apenas adicionar a função tem um método abstrato
à nossa classe Bird. E isso é verdade. E depois das classes são semelhantes
às interfaces de alguma forma. Mas a principal diferença
aqui é que você
normalmente desejaria usar uma interface sempre que você tiver apenas funções
abstratas e não tiver nenhum outro
tipo de função. E uma diferença importante aqui, como mencionei anteriormente, é que podemos implementar quantas
interfaces diferentes quisermos. Por exemplo, se eu tivesse outra
interface chamada animal para, eu poderia implementá-la aqui. Eles são separados por vírgulas, mas em Java só podemos
estender uma única classe. Portanto, essa é uma vantagem
que as interfaces têm é que você pode usar o maior
número possível delas. Então você normalmente quer
usar interfaces a menos que faça sentido
realmente usar uma classe. Por exemplo, você tem uma funcionalidade
padrão que deve ser herdada ou tecnicamente estendida por
cada classe filho. Mas, caso contrário, se você
tiver apenas essas funções aqui, que cada classe
filho individual, como Robin e Cro, deve realmente se substituir
e implementar a si mesmas, então você deve
usar uma interface.
39. Instância de: E se você quisesse
verificar certos tipos de classes em relação a outros
tipos de classes? Por exemplo, vou
começar com o código que
deixei no último vídeo, mas vou me livrar de todas as
instruções de impressão aqui. Só agora temos um
corvo e um robin. Não posso ter uma
declaração if dizendo que se um corvo é uma instância de um pássaro, posso imprimir Corvo é um pássaro. E aqui recebemos esse aviso. Se eu passar o mouse sobre
ele, diz que a incidência de
crescimento condicionado de
aves é sempre verdadeira. Isso porque essa linha
aqui é apenas uma variável
que criamos, mas nunca a
mudamos. Ele sabe com certeza que este
é um exemplo de um pássaro porque cro estende Bird
como vemos aqui. Agora, é claro, se eu executar
isso, é co-investir, dizer que um corvo é um pássaro,
como vemos aqui. Mas isso também pode ser
feito com interfaces. Então, um corvo é uma
instância de um animal. Agora, se eu executar isso,
teremos
a mesma resposta exata que vemos aqui. Claro, tecnicamente
devemos mudar a
sentença para dizer que um corvo é um animal.
Mas você entende a ideia. instância do pode ser útil
se quisermos verificar se um determinado objeto é uma instância de outra classe
ou de uma interface. E este é
mais um caso de uso para interfaces porque
tecnicamente você não precisa
necessariamente
ter nada dentro da interface e
ele ainda funcionará. Por exemplo, um robin
ainda está implementando animal, e o CRO
ainda está implementando vida útil média dos
animais
agora apenas se torna um método normal
que está ligado
à classe corvo e anexado à
classe robin, respectivamente. E não tem nada a ver com
a interface animal. Mas agora que um robin e CRO são ambos animais porque
ainda estamos implementando
a interface. Ainda podemos usá-los
e verificações assim.
40. Enumeras: Agora vamos nos
afastar da programação orientada a
objetos e passar para outros
aspectos do Java. Por exemplo, neste vídeo, vamos
aprender sobre enums, o que significa enumerações. Basicamente, esses são tipos
específicos de valores que são variáveis semelhantes, mas não podem mudar e
podem ser usados de maneiras muito
específicas. Então, vamos seguir em frente e
criar um novo arquivo aqui. Assim, podemos selecionar a classe Java. Então aqui podemos selecionar enum. Vou ligar para
esses dias da semana. Você pode ter enums para ter os valores
que quiser. Mas, normalmente,
essas serão coisas que nunca devem mudar. Portanto, eles não são tecnicamente como uma variável onde você pode ter entrada de um usuário ou algum
tipo de número aleatório. São coisas que
serão concretas
e sempre usarão exatamente
da mesma maneira. Um bom exemplo disso
são os dias da semana, que não mudarão. Aqui, vou adicionar
uma vírgula de domingo. Percebi como estou digitando
todas as letras maiúsculas. Esta é uma convenção comum
quando realmente usa enums. Então, podemos ter
segunda, terça, quarta, quinta,
sexta e sábado. Obviamente você soletra corretamente. Agora temos esses sete
valores diferentes dentro do nosso enum, mas como realmente
os usamos e como eles são úteis? Então, voltando ao
nosso arquivo principal, aqui, posso dizer pontos de dias de semana. E então eu posso acessar cada valor individual,
se eu quisesse. Ou posso obter todos
eles como uma matriz. Aqui vemos que o
método values está incorporado em enums e retorna dias
da semana como uma matriz. Mas, por exemplo, se eu
quisesse imprimir dias da semana na sexta-feira,
posso executar isso. Aqui vemos sexta-feira
no console. Também podemos usá-los
com instruções if. Agora, cada valor de enum individual também tem um conjunto de métodos
diferentes. Por exemplo,
podemos compará-lo com outra instância de dias por semana. Podemos obter o nome, podemos obter o ordinal, a menos que dê uma
olhada rápida nessas duas coisas. Então fui imprimir o nome. Então vou copiar
e colar esta linha. E vou imprimir
o ordinal. Agora, se eu executar isso aqui, veremos sexta-feira novamente, e então 55 será o índice real
que isso é usado. Por exemplo, domingo é 0. Agora você não precisa
adicionar esses comentários, estou apenas fazendo isso
para tornar mais fácil para nós realmente ler isso. Então aqui temos 012345
e, claro, sábado
seria seis, mas é por isso que vemos
cinco e nosso console. Vou me
livrar de tudo isso. E agora vamos expandir
esse enum. Por exemplo,
digamos que eu não queira que a
sexta-feira seja maiúscula, mas quero reescrever uma string específica como
um nome daquele dia. Tão semelhante às classes, os enums podem realmente ter
seu próprio construtor. Vou colocar um ponto e vírgula
no final de todos os meus valores neste caso teve um sábado. E então aqui posso
dizer dias da semana. Agora você pode
notar que eu não tenho público ou privado ou
algo assim aqui. Isso porque se eu passar o
mouse sobre esse erro, ele diz que o modificador público
não é permitido aqui. A razão para isso é que esta função de
construtor
aqui só pode ser executada
dentro do próprio enum. Por exemplo, entre parênteses de
domingo. Aqui nós passaríamos em diferentes argumentos
para o construtor. Não podemos acessar
esse construtor fora desse arquivo eNode. Mas por que precisaríamos de um
construtor em primeiro lugar? Bem, podemos realmente armazenar em valores
diferentes para cada valor de enum
individual. Semelhante às
propriedades privadas de uma classe, acho que digo nome de string privada, acho que um
booleano privado, Workday. E então, dentro do construtor, posso exigir essas
duas propriedades. Então, nome da string,
booleano, dia útil. Então posso dizer que this.name é igual nome e esse
dia útil de ponto é igual a dia útil. Agora temos alguns erros
em cada um dos nossos valores. E isso porque, por
padrão, ele chamará um construtor sem argumentos
internos. Mas é claro, se
eu passar o mouse sobre
isso, ele vai esperar uma
string e um booleano. Aqui. Posso passar no domingo e depois posso dizer falso
por ser um dia de trabalho. Vou fazer a mesma
coisa por todos esses. Então, por exemplo, segunda-feira e verdade, como eu digo terça e verdade, quarta-feira e uma verdade. Eu posso então passar na quinta-feira. E é verdade. Aqui temos uma sexta-feira e verdade, e finalmente,
sábado e falso. Agora não temos mais erros,
a menos que tentemos usar um desses dentro do
nosso arquivo real aqui. Em vez de dias por semana,
ponto Theta dot name, posso acessar os
valores reais, como dia da semana? E não podemos,
na verdade, temos que fazer nossos próprios ganhadores
públicos para fazer isso. Aqui posso dizer público,
string getName. Agora posso retornar o nome. Então posso dizer que
booleano público é Workday, e agora posso retornar o dia útil. Getname não é um
bom nome para o método. A razão para isso é que isso pode ser facilmente misturado com o nome. Por exemplo, temos
nome e getName. Não está claro qual
deles queremos. Uma coisa que podemos fazer
é renomear isso para obter o Nome de exibição. Agora, um nome para exibição
como algo que normalmente
será mostrado aos usuários. Então, algo com um F
maiúsculo e minúsculas, todo o resto seria um nome de exibição melhor que
tudo sendo maiúsculo, tudo sendo maiúsculo, parece estranho para o usuário. E então um F maiúsculo com
tudo minúsculo, é na verdade como
você diria isso. Normalmente, esse seria
um nome de exibição adequado. Voltando em vez de GetName, agora
posso dizer o nome de exibição das crianças. Então, é claro que aqui vou
dizer Friday dot é dia útil. Acho que vá em frente e execute isso. Devemos ver o nome de exibição , bem
como se for um dia de trabalho, que neste caso S
tem sexta-feira e verdadeiro. Agora você pode realmente usar
enums como tipos de variáveis. Por exemplo, posso
dizer dias da semana, dia é igual a dias da semana, segunda-feira. Posso dizer que se o
dia é dia útil, posso imprimir
indo trabalhar hoje. Caso contrário, posso
imprimir que é um fim de semana. Agora, se eu executar isso, vamos ver
indo trabalhar hoje porque estávamos acessando o valor Day,
que é igual a segunda-feira. Mas é claro, se
eu mudar isso para sábado e eu executar isso, agora
vemos que é um fim de semana. Agora, há mais
uma coisa que eu queria mostrar a vocês com enums, e essa é a capacidade de
percorrer todas elas, como eu disse, quatro
dias de semana, dia. Aqui posso passar em dias por
semana valores de pontos. Se eu passar o mouse sobre isso,
veremos que isso retorna uma matriz de dias por semana. Esta será uma matriz de
cada valor individual como seu próprio elemento. Dentro daqui posso
imprimir o ponto do dia, nos
pegar pelo nome e depois dois pontos. Então eu posso adicionar no
dia é Workday. Se eu executar isso, ele vai
percorrer todos os dias. Ele vai imprimir o nome
deles, bem
como um booleano, se for
um dia de trabalho ou não. Obviamente, com uma enums, não
estamos recebendo
nenhuma entrada externa de outras partes do programa. Tudo com um
enum ou auto-fechado, o que
significa que os argumentos
passaram para o construtor ou apenas valores estáticos que
não são realmente variáveis. Como você pode ver, estou
apenas passando uma string e uma passagem
em um valor booleano. Não estou passando
nenhuma variável. Enums são úteis sempre que você tem algo
como os dias
da semana em que eles são concretos e nunca
vão mudar. Nem mesmo as variáveis que passam
pelo construtor, elas não
vão mudar. Isso é muito útil
se você tiver coisas muito
concretas como essa, porque então você pode
facilmente acessá-las e referenciar certos valores sem se preocupar com eles em
constante mudança.
41. Tente Pegar finalmente: Em um vídeo anterior, quando usamos scanners, vimos como é um erro. Vamos em frente e
recriar isso. Posso criar um scanner. Eu chamo de entrada e seno é igual ao valor
do novo Scanner. Aqui eu posso passar no System.in. Tudo isso deve ser
bastante familiar para você desde o início do curso. Agora, aqui vou
simplesmente imprimir o ponto de entrada next int. E se eu executar
isso, esperará que eu
insira um número inteiro. Por exemplo, se eu digitar cinco, tudo funcionará bem
e o processo terminou com um
código de saída bem-sucedido, que é 0. Mas se eu executar isso novamente e inserir uma string como teste, agora
obteremos uma exceção. Isso é basicamente apenas um erro. E, à primeira vista, isso
pode parecer muito confuso, mas na verdade é muito simples. Basicamente, temos
uma exceção
no thread main
e ele
terá uma lista de onde vieram todos
os erros. Isso é conhecido como um rastreamento de pilha. E isso é basicamente
rastrear exatamente de onde veio
o erro. Agora, tudo isso é
realmente clicável
e, na verdade, vemos o
nome do erro
aqui como exceção de
incompatibilidade de entrada. Isso acontece quando inserimos algo que
não é do tipo adequado. Na verdade, posso
clicar em um desses, por exemplo, o scanner dot Java. E isso vai
abrir a pele ou a aula, que tem um monte de coisas
com as quais realmente não
precisamos nos preocupar.
Vou fechar isso. Mas o mais importante é que
podemos clicar em nosso próprio código. Na verdade, podemos
ver isso em azul. Se eu fechar todos os meus arquivos, posso clicar
nisso aqui, vou
abri-lo e me colocar na mesma linha exata
onde está o erro. Bom, mas como
realmente corrigimos isso? Podemos usar algo
conhecido como try-catch. Vou adicionar
um comentário aqui. Temos try-catch e também
temos outra opção
conhecida como finalmente, a sintaxe para isso
seria tentar chaves curly, e depois você
tem que adicionar um catch. Isso vai
ter uma exceção. Vou chamar isso de
exceção aqui. E existem diferentes
tipos de exceções. Normalmente, você não quer ter uma exceção genérica aqui, mas sim você quer usar o tipo exato de exceção que você espera capturar. Nesse caso, é uma exceção
de incompatibilidade de entrada, como podemos ver no rastreamento de
pilha aqui. Então, em vez de apenas
dizer exceção, vou dizer exceção de
incompatibilidade de entrada. Agora dentro daqui posso dizer
e dot print stack trace. E isso basicamente
vai fazer exatamente
a mesma coisa que vemos no nosso
console aqui. Para provar isso, posso pegar
essas declarações de linha de impressão. Posso colocá-lo dentro
do try-catch. Se eu executar isso, vamos
obter os mesmos resultados exatos. Se eu inserir
algo que não é um número inteiro, por
exemplo, essa string. Aqui vemos o erro exato. Então, o que exatamente está
acontecendo aqui? Bem, basicamente vamos
tentar esse código aqui. Se algo não funcionar
, isso
lançará um erro. Agora, por padrão, se
não detectarmos um erro, o programa falhará. Para provar isso, posso trazer
essa linha de volta aqui. E vou
comentar nosso try-catch por enquanto. E para fazer isso com
várias linhas, basta
selecionar todas
elas e, em seguida, controlar barra
direta ou a barra de comando
em um Mac. Agora, dentro daqui vou
imprimir funcionou. Isso é depois de termos
recebido a próxima entrada int. Se eu executar isso, ele vai me
pedir um número. Vou entrar em cinco
e funcionou. Mas se eu executar isso novamente
e entrei no teste, não vai dizer que funcionou. Isso porque o
programa realmente falhou. E então tudo além
disso não vai ser rampa. Esta é a principal razão pela qual
você deseja usar o try-catch. Porque se eu imprimir
funcionou depois
disso e eu executar o programa aqui, posso entrar no teste. E ainda vai lançar
o erro porque estamos imprimindo por causa da linha 14,
edição, impressão do rastreamento da pilha. Mas isso não vai
travar o programa. E vemos isso
porque estamos
imprimindo trabalhado logo depois. Sempre que você tiver algum código que possa lançar uma exceção, você queria
ter certeza de capturar essa exceção e, em seguida,
lidar com ela de acordo. Em alguns casos, isso
pode estar imprimindo. Você não inseriu um número e não
precisamos necessariamente
imprimir um rastreamento de pilha. Então, vou remover isso. Agora, se eu executar isso e
entrar no intestino, não
veremos o erro. Em vez disso,
vamos ver isso. Você não inseriu um número. Agora eu mencionei
essa coisa finalmente. O que exatamente é isso? Bem,
isso sempre vem depois. Tente pegar. Aqui eu posso adicionar. E, finalmente, isso
é algo que será executado, não
importa o que aconteça. Então tente corremos uma
linha de cada vez. Então, ele executará esta linha,
esta linha e esta linha. Se alguma vez houver uma exceção, ela imediatamente deixará de
tentar executar esse código aqui. E ele imediatamente saltará
para a declaração de captura, basicamente executando o que estiver dentro desses
aparelhos encaracolados aqui. E, obviamente, com
isso dito, esse código destacado aqui
só será executado se
houver uma exceção. Se tudo funcionar bem dentro
do try-block aqui, o código de captura nunca
será executado. Mas finalmente está
passando por correu não importa o que aconteça, não importa se tudo
funcionou perfeitamente bem ou se há uma exceção,
posso imprimir. Finalmente correu. E vou
executar isso aqui. Posso inserir um número,
digamos dez. E aqui vemos
finalmente que foi executado. Se eu executar isso novamente, posso inserir uma string. Vemos que você não
inseriu um número, mas ainda vemos finalmente o RAN. Agora, isso é útil em
muitos casos de uso, mas um muito específico está fora do escopo
de todo esse curso. Isso é basicamente quando se trata de conexões
de banco de dados. Essencialmente, com
nossa instrução try, tentaríamos nos conectar
ao banco de dados. Em uma captura, nós
lidaríamos com qualquer erro e exemplo sendo detalhes de
login inválidos. E, finalmente,
fechará todas as conexões abertas. Agora, em alguns casos de uso, você verá conexões como esta, e este é um bom exemplo na teoria do vento
finalmente pode ser usado.
42. Que a entrega de erros: No último vídeo,
demos uma olhada em como lidar com diferentes erros. Mas o que quisermos
criar nossos próprios erros. Por exemplo, vou excluir tudo isso e
vou alterar esse comentário aqui para
gerar um erro. E é isso que
vamos chamá-lo sempre que quisermos
criar nosso próprio erro. Por exemplo, aqui
posso dizer uma string. A próxima string é igual ao ponto
de entrada na próxima linha. Agora, dentro daqui,
vou dizer que se o próximo ponto de string for igual a
ignorar erro de caso, eu não queria
lançar meu próprio erro. Para fazer isso, posso dizer lançar uma
nova exceção e
posso passar em uma string. E esta será
a mensagem impressa no console. Por exemplo, um
erro foi dado pelo usuário porque o usuário insere a string aqui como erro. Mas recebemos um erro agora. A solução aqui é adicionar a exceção à assinatura do
método. Se eu clicar nisso,
nosso método principal agora diz que lança exceção. Isso basicamente dirá ao Java
que, dentro dessa função, vamos lançar
nossa própria exceção. Agora, fora da
nossa declaração if, posso imprimir qualquer que seja a próxima string
do usuário. Vou seguir em
frente e executar isso. E dentro daqui vou
entrar no HelloWorld e ele deve imprimir o hello world e tudo funciona
exatamente como esperado. Mas se eu executar isso mais uma vez, não
consigo imprimir o erro. E isso fará com que
essa afirmação se seja verdadeira. Então, se eu pressionar Enter, agora teremos nossa própria exceção. Aqui temos a corda. Ele diz que um erro foi
dado pelo usuário, e podemos clicar nisso para ver onde a
exceção foi lançada. Agora você pode estar se perguntando, por que gostaríamos de fazer isso? Por que não apenas dizer ao usuário para
não inserir o erro de string? Bem, uma das razões pelas quais você
quer fazer
isso é para que os programadores que estão
usando seu código ou você mesmo com outras partes
do seu projeto sejam forçados a detectar certos erros
e interagir corretamente. Por exemplo, se você estiver
criando seu próprio programa outros desenvolvedores estarão
baixando e importando. Em seguida, você pode lançar erros
diferentes que os desenvolvedores sejam forçados a pegá-los e lidar com
isso de acordo com a
forma como eles querem. Dependendo do
tipo de erro que ele é. O mesmo conceito vale
para seus próprios projetos. Você pode lançar certos erros sempre que certas
coisas estiverem acontecendo. Em outras partes do seu programa, você pode usar o sistema
try-catch para realmente
resolver esse problema.
43. Listas e arranjadas: Novo no início do curso, tivemos que olhar para matrizes, mas agora vamos dar uma
olhada em listas e ArrayLists. Essas serão, basicamente formas
mais avançadas
de usar arrays. E em muitas situações
que serão mais fáceis de usar
e mais poderosas. Então, digamos que eu queira
ter uma matriz de números inteiros, como eu digo int numbers
é igual a colchetes. E aqui posso adicionar na minha lista de números, por exemplo, 123. Agora digamos que eu queira ir em frente e adicionar um quarto elemento. Bem, se eu disser que o
índice de números três é igual a quatro, agora
vamos
ter um erro. Se eu passar o mouse sobre isso, ele diz índice de
matriz fora dos limites. Basicamente significa que qualquer array não pode ter
coisas novas adicionadas a ele. Você teria que criar uma matriz
totalmente diferente. Por exemplo, eu poderia
dizer que números são iguais uma nova matriz inteira com 1234
nele. E isso funcionará. Mas, obviamente, não
quero ter que fazer isso. Eu quero a capacidade de
simplesmente adicionar algo
a esse array. Mas, por padrão, os arrays
não têm essa funcionalidade. É por isso que temos listas de matrizes. Essas são maneiras muito mais fáceis usar arrays onde podemos
facilmente remover coisas, adicionar coisas, é claro, acessar, coisas semelhantes
ao apagamento existente. Vou seguir em frente e
comentar essa linha aqui. E vou fazer
uma nova ArrayList. Agora, o primeiro passo é
criar uma lista genérica. Isso vai
ser do Java util. Isso vai
ser uma interface, como podemos ver no ícone
verde aqui. Agora, dentro daqui,
temos que passar em que tipo de dados estamos
olhando para uma loja e não podemos passar um int porque isso tem
um tipo primitivo, precisamos passar em
uma determinada classe. Dentro do Java, temos acesso
ao inteiro, que é uma classe. E isso nos permitirá
usar números inteiros nessa lista. Então, vou chamar
essa lista de números. Assim, podemos atribuir isso
igual a uma nova ArrayList. Agora aqui temos apenas menos e
maior que o sinal. E então esses parênteses, o sinal menor que e
maior que, poderiam conter o
valor HEPA que você quer, por exemplo, um número inteiro. Mas no Java moderno, não
precisamos fazer isso. Ele basicamente
acessará o tipo de valor que precisamos do inteiro
que passamos aqui. O que exatamente aconteceu? Bem, se eu passar o mouse sobre a lista aqui, vemos que esta
é uma interface, como vemos aqui, interface
pública. E isso nos dá várias funcionalidades internas
diferentes que maioria das listas
diferentes terá. Agora, depois de dizer isso, eu deveria ter mencionado
que ArrayList não
é o único tipo de lista, mas é o mais fácil de
entender e o
mais fácil de demonstrar. Vamos usá-lo
para este tutorial. Agora, ArrayList é sua
própria classe que implementará
a interface de lista. Então, ele terá todas as funcionalidades
que a lista oferece, mas também se baseará nela. Isso é legal e
tudo mais, mas como eu realmente uso a lista de números? Bem, aqui posso
dizer números ponto. A primeira opção é onde podemos passar em uma coleção
diferente, como outra lista e
adicionar todos os elementos a ela. Ou podemos adicionar
elementos individuais, como um número inteiro. Por exemplo, um. Agora, se eu tivesse números pontuando aqui, podemos adicionar um determinado elemento
em um determinado índice. Também podemos limpar a lista. Podemos ver se está vazio, há várias outras opções como remover
certos elementos, obter o tamanho atual ou a quantidade de
elementos na lista, e muitas, muito mais. Vamos em frente e adicionar todos os três números que
queríamos a esta lista. Números, não adicione dois
números, adicione três pontos. Agora, os números
ArrayList são muito semelhantes à matriz de números
que comentou. Agora, obviamente, em um
exemplo tão simples, isso não importa. Mas se realmente quisermos adicionar, digamos, dez ou 100 números, podemos facilmente percorrer
esses números e depois passá-los para a
função add aqui. Ou, se
quisermos, podemos passar uma matriz para
o novo
construtor de lista de matrizes aqui. Agora não podemos simplesmente passar
em uma matriz genérica. Temos que dizer matrizes com
um ponto maiúsculo como lista. Agora dentro daqui,
teremos um varargs com qualquer número de
números inteiros. Então eu posso dizer 123. Agora, se eu excluir
isso, ainda teremos o
mesmo resultado exato. Portanto, se você tiver uma matriz
existente, poderá passá-la facilmente, semelhante a uma sintaxe como esta. Mas normalmente você
não vai fazer isso. Na maioria das vezes. Você só
criará uma ArrayList e depois adicionará coisas
a ela conforme você precisa. Então, vamos ir em frente e
imprimir tudo aqui. Posso imprimir números. E se eu executar isso, agora
vemos 123. Vamos seguir em frente e tentar
mover alguns elementos daqui. Posso dizer que os números ponto removem. Aqui podemos passar em
um objeto específico ou em um número inteiro específico. Um número inteiro não
removerá esse elemento específico. Isso realmente
removerá o índice. Eu meio que movo o índice um, que
será o valor dois. Eu executo isso, agora vemos apenas 13 em nossa matriz, como
fazemos aqui. Mas o que acontece se eu quiser realmente remover
o número dois? Bem, como eu disse, o
valor inteiro de e passa para dentro. Agora, se eu executar isso,
vamos ver 13 como fazemos aqui. Agora isso pode parecer
um pouco estranho. Por que realmente
temos que fazer isso? Bem, se eu disser números
ponto remover aqui, vemos que este é
um método sobrecarregado. Podemos passar em um
índice ou um capacitor, um objeto para passar
apenas o número dois ou o número um ou
qualquer tipo de inteiro básico. Vai tratar isso como
um tipo primitivo de int. Ele usará a
amostra de tópico aqui. Mas se passarmos em
uma classe específica ou um objeto que
represente algo, então ele usará a
segunda opção aqui. Isso é exatamente o que estamos fazendo com essa linha de
código aqui. Isso passará em um objeto e não apenas em
um inteiro primitivo. Em seguida, ele passará pela
ArrayList e tentará remover quaisquer elementos que
correspondam a esse valor aqui, que, neste caso, ele faz ,
como vemos, não
vemos o número dois. Agora vamos imprimir
quantos elementos
existem no surrealista. Então eu poderia dizer números tamanho de ponto. Se eu executar isso aqui,
veremos dois no console. E também podemos limpar isso. Então, vamos em frente
e dizer números. Ponto claro. Agora, se eu executar isso, ele
vai realmente limpar isso depois que imprimirmos os dois
números como vemos aqui. Mas nosso tamanho agora está em 0 porque, na verdade,
limpamos a ArrayList. Agora, uma ArrayList e escuta geral é conhecida
como uma coleção. É basicamente uma
classe personalizada que nos
permite adicionar certas coisas
e remover certas coisas. E há vários exemplos
diferentes deles. Neste vídeo e
no próximo vídeo,
vamos rever dois exemplos. Mas, honestamente, cobrir
cada exemplo
justificaria seu próprio
curso apenas sobre isso. Então, vamos apenas
manter algumas das coleções mais básicas e
mais usadas, coleções mais básicas e
mais usadas, como ArrayList e HashMaps, que vamos dar uma
olhada no próximo vídeo.
44. Mapas e mapas Hash: Agora vamos dar
uma olhada no HashMaps, que são uma maneira de
armazenar algo conhecido como par de valores chave. Basicamente significa que,
para cada chave, há um valor correspondente. Vamos dar uma
olhada em alguns exemplos. Aqui. Vou ter um
mapa, e isso
armazenará uma chave e um valor, que podem ser dois
tipos diferentes de variáveis. Por exemplo, a chave pode ser uma string e o valor
pode ser um inteiro. Semelhante a ArrayLists,
esses precisam ser os tipos de classe reais. Portanto, não podemos dizer int aqui. Teríamos que especificar um
inteiro com um I maiúsculo. Dentro daqui, posso adicionar
diferentes tipos de pontuações. E vou atribuir um
igual a um novo HashMap. Agora, semelhante a uma ArrayList, podemos adicionar uma string e um
inteiro, se quisermos. Mas no Java moderno não é
necessário, então eu não vou. Agora, o que exatamente é um par de valores chave listado nessas pontuações é
para um determinado videogame. Posso dizer pontuações pontuais. E aqui podemos ver que estamos
passando em uma string, que é o que temos
desta string aqui. E também estamos passando em um número inteiro desse
número inteiro aqui. Este é um par de valores-chave. Por exemplo, digamos que eu tenha 77 pontos neste jogo. Posso dizer pontuações pontuações colocadas. Bob tem pontos PD no jogo
e marca pontos colocados aqui, joe tem 30 pontos no jogo. Vamos em frente e imprima
isso no console. Então eu posso imprimir pontuações
e posso executar isso. E aqui vemos Alex é igual a 77, Joe é igual a 30 e
Bob é igual a 80. Mas que outras opções
temos quando se trata disso? Posso dizer que pontuações pontuam aqui. Eu posso obter uma, uma certa coisa. E era aqui que
passaríamos na corda. Por exemplo, posso passar por um Alex. E vou cortar esta linha
inteira aqui com Control X ou o Command X no Mac. E então eu posso imprimir isso. Posso colá-lo com Control
V ou Command V em um Mac. E se eu executar isso,
vamos obter as pontuações para a string Alex,
neste caso é 77. Se eu disser pontuações pontuais, poderíamos limpá-lo de
forma semelhante a uma ArrayList. Isso apenas removerá
todas as entradas. Podemos obter um conjunto de entradas ou um
conjunto de chaves. Também podemos obter os valores
e vamos dar uma
olhada no que essas três coisas
fazem aqui em um momento. Podemos ver se está vazio. Podemos substituir certas coisas. Podemos obter o tamanho. Aqui é onde podemos
obter os valores. Também podemos ver se
ela contém uma chave, horrível atinge um valor. E há várias
outras opções, como removê-las. A maioria deles é
autoexplicativa, outras que você pode ter que experimentar ou
procurar a documentação. Vamos seguir em frente e tentar
percorrer todas
as chaves ou todos os
valores ou ambos. Vou me livrar
dessas declarações impressas aqui. Vou dizer para a chave de string. E então aqui vamos
usar um loop para cada. Então, temos nosso cólon aqui. Agora posso dizer
pontuações conjunto de teclas de ponto. E isso retorna um
conjunto que é semelhante em conceito a uma lista que
vimos no último vídeo. Agora, dentro daqui, posso
simplesmente imprimir a chave. Se eu executar isso, ele
vai imprimir Alex, Bob e Joe, como
vemos aqui. Mas agora o que acontece
se quisermos ter acesso aos valores? Posso dizer pontuações ponto v, e aqui temos valores. Agora teríamos que
mudar isso para um int, acho que eu int valor. E então eu posso imprimir valor. Se eu executar isso, agora
podemos ver todos os três valores
desse mapa exato. Mas e se eu quisesse
ter acesso a ambos? Bem, posso dizer para
entrada com um E maiúsculo, vamos usar isso a
partir de Java util map. Aqui temos que especificar quais
tipos de variáveis precisamos. Então, neste caso, uma
string e um inteiro. Vou chamar
essa entrada de variável. Então, com dois pontos, agora posso
dizer pontuações ponto entrySet. Agora, se eu passar o mouse sobre os conjuntos de entradas, isso retornará um conjunto de uma entrada
que tem um K e V, que significa chave e valor. Então, essencialmente,
posso dizer que a chave
fgetc de ponto de entrada ou ponto de entrada obter
valor para obter acesso a ele. Por exemplo, a
chave de string é igual a entrada, talk KCI e, em seguida, int value
é igual ao valor get do ponto de entrada. Em seguida, posso imprimir a chave
que tem o nome de usuário, tem pontos de valor mais. Agora, se eu executar isso, ele vai
imprimir o que cada usuário tem e seus
pontos correspondentes, como vemos aqui.
45. Como construir um arquivo Jar: Estamos prestes a abordar o projeto
final do curso, que será refazer o jogo Battleship dentro de Java. Mas antes de
fazermos isso, precisamos ter
certeza de que entendemos como realmente converter nosso código Java em
um arquivo executável. Você pode estar familiarizado com os arquivos
dot EXE, onde você pode clicar duas vezes neles e
ele abrirá um programa. Em Java, temos
um arquivo jar de pontos, que você provavelmente
já viu antes. Como convertemos exatamente
todo o nosso código-fonte em um arquivo jar de ponto que
podemos realmente executar. Bem, o primeiro passo é
clicar na engrenagem
no canto superior direito e depois
ir para a estrutura do projeto. Ou você pode usar esse
atalho confuso aqui. Quando estiver aqui,
você deseja ir para
a esquerda e clicar em artefatos e, em seguida, clicar no mais passar
o mouse sobre jar e, em seguida, ir para
módulos com dependências. A partir daí, precisamos
especificar uma classe principal. Esta é basicamente a classe
em que nossa função principal está. Se eu clicar em uma Pasta Aberta, ela selecionará automaticamente
todos os arquivos diferentes que têm uma função principal
neles. Então, só temos um. Podemos simplesmente clicar em OK
e, em seguida, clicar em OK novamente. Agora, a partir daqui,
posso clicar em Ok. Em seguida, posso clicar em
Construir, criar artefatos. E a partir daqui
podemos simplesmente pressionar Enter ou você
também pode clicar em Construir. Vemos que ele está construindo
algo perto do fundo. E agora isso é feito, podemos expandir nosso
diretório OUT, entrar em Artefatos. E aqui vemos nosso pote de pontos
de espaço de trabalho. Vou
clicar com o botão direito sobre isso. Eu poderia então clicar em Copiar referência de barra de
caminho. E, a partir daqui, vou
clicar no caminho absoluto. Se eu colar isso,
esse será um caminho de arquivo para esse arquivo jar
exato. Agora, para executar isso, não podemos
simplesmente abri-lo. Precisamos realmente
executá-lo através de um terminal. A razão para isso, se este
for um aplicativo de console, o que significa que
estamos trabalhando em nosso console como
vimos em
todo esse programa. Portanto, não temos uma janela personalizada com
botões e imagens
e todas essas coisas que estão fora do escopo
deste curso. Não cobrimos nada
disso neste curso. Então, como exatamente executamos isso? Temos que abrir
nosso próprio terminal. Se você estiver no Windows, você pode ir frente e fazer uma
pesquisa ou comando
e, em seguida, vá em frente
e pressione Enter. Agora, se você estiver em um Mac
porque eu não tenho um Mac, não tenho certeza de como fazer isso, mas você pode
simplesmente pesquisar como abrir terminal no Mac e ele deve
ter vários resultados. Então, vou te ajudar. Agora, de qualquer forma, depois de ter o prompt de comando ou
o terminal aberto, você pode digitar espaço Java, espaço jar de
traço e, em seguida, você
deseja colar em seu caminho. Mas esteja ciente de que se você tem
espaços em seu caminho, você precisa rapidamente
tudo e aspas duplas. Vou adicionar em códigos duplos aqui. E então, dentro, posso clicar com o botão
direito do mouse para colar no caminho. Aqui vemos que a
pasta de chaves Warnock tem espaços nela. Então eu tenho que adicionar
aspas duplas em ambos os lados. Se eu pressionar Enter, veremos que
nada realmente acontece. Isso porque nosso código
não faz nada. Vamos prosseguir e
imprimir o texto, Hello World. E depois vou
para Construir,
construir artefatos e pressionar Enter. Aqui vemos que está
construindo mais uma vez. Voltando ao terminal, posso pressionar a seta para cima para
ir para o comando anterior. Se eu pressionar Enter, agora
vai dizer helloworld. O código real agora é executado
através desse arquivo jar.
46. Introdução ao projeto de Battleship: Agora vamos
mergulhar no projeto final para
o curso que vai
fazer um jogo de
Battleship para um jogador. Aqui vemos esta placa e
temos cinco
tipos diferentes de navios, e todos eles estão
posicionados aleatoriamente ao redor do tabuleiro. Podemos então inserir
coordenadas, por exemplo, um 0, que está realmente vazio
como podemos ver aqui. E então dirá senhorita. Mas posso selecionar H para essa
coordenada aqui. E então dirá hit. E isso agora é
substituído por um x. se eu fizer eu, então j 0
vai dizer, use afundou seu encouraçado e todo esse navio
aqui está afundado. Agora, ao contrário dos vídeos anteriores no curso em que
escrevemos código juntos, durante este projeto,
vamos trabalhar
nos planos para cada recurso
individual juntos. E então eu queria tentar criar esse recurso por conta própria. Agora, depois de
concluir esse recurso, ou depois de
sentir que fez o máximo que
puder e ainda
precisa de ajuda adicional. Você pode então ir para
a próxima seção
do vídeo, onde realmente
o construiremos juntos. Mas eu encorajo você a
experimentar cada parte individual
deste projeto sozinho antes assistir ao tutorial
passo a passo. É assim que os desenvolvedores
de software reais funcionam. Portanto, é um ótimo hábito
entrar dessa maneira. Você pode criar uma habilidade de
resolução de problemas
usando a programação.
47. De arquivos e coordenadas: Para iniciar o projeto, eu excluiria todos os arquivos
que você tem em seu projeto
como casa segura, o arquivo que tem
sua função principal em que
eu estava cria esses
cinco arquivos diferentes aqui. E tenha em mente que o arquivo Maine
do navio de guerra. Isso contém minha
função principal aqui. Agora há muitas
peças dentro desse projeto que
dependem umas das outras. Por exemplo, se eu
passar o mouse sobre minha função principal aqui, estou criando um objeto player e estou criando um objeto de quadro. Para tornar
as coisas passo a passo, queremos começar com a
menor peça possível que não
dependerá de mais nada. E também será
usado e vários outros lugares neste projeto aqui que serão
uma coordenada. Agora eu mencionei que você
deveria escrever tudo sozinho antes de realmente
seguir. Mas esse arquivo é muito simples. Então, eu só vou atropelar esse arquivo muito rápido com você. E em vídeos futuros
com este projeto, você vai querer experimentar
as coisas sozinho antes acompanhar passo a passo
com minhas próprias explicações. Aqui temos uma classe de acordes
que significa coordenadas. Isso
representará um
valor x e y no próprio quadro. Também terá
uma propriedade booleana, que representará
se isso tiver sido atingido. Portanto, significa
que se uma nave estiver lá e nós realmente
adivinhamos essa coordenada. Agora, quando criamos
uma coordenada, estamos simplesmente passando
x e y através do construtor e estamos atribuindo-a às variáveis
locais aqui. Em seguida, temos um getter
e setter para todas as três propriedades privadas, o x, o y e
o é atingido Booleano. Então, essencialmente, somos
capazes de obter o x, obter o y, C Se essa coordenada for atingida, bem
como esses valores
individuais também. Agora aqui temos uma função
toString. Sempre que imprimimos um
objeto no console, ele realmente executará a função
toString nos
bastidores. Então, essencialmente, se
fôssemos imprimir uma coordenada, ela vai
imprimir x vírgula y. Agora, apenas para esclarecimentos, se você não sabe
o que é um quarto. Cada célula individual aqui será sua
própria coordenada. Por exemplo, isso tem ser 0, este é um, e assim por diante. Eventualmente, vamos
criar nosso próprio quadro aqui. Somos diferentes navios
são colocados aleatoriamente e as colunas do tabuleiro são representadas das
letras de a a J. E as linhas do tabuleiro
são representadas dos números
de 0 a nove. Agora, esse valor
x e y representará onde eles estão
dependendo das colunas e linhas. E o valor do quadril
representará
se isso tiver sido um sucesso real. Portanto,
adivinhamos onde está um navio. Aqui temos um C5, por exemplo,
para esta célula aqui. Se eu disser C5, então vou mudar
para um x. Portanto, essa
coordenada e meu programa tem o
valor muda para true.
48. Navios: Vamos agora criar
nossa própria nave. E antes de você realmente escrever
qualquer código você mesmo, sugiro que
realmente olhemos o plano para essa classe e exatamente as
dicas que eu dei aqui. O que exatamente é um navio? Bem, obviamente dentro
do nosso programa aqui, se eu abri-lo, isso representará uma nave real onde aqui temos quatro
coordenadas diferentes. E a situação temos
cinco coordenadas diferentes. Este é um navio menor, era apenas dois deles no
total, cinco fichas diferentes. Então, se olharmos para essa classe, a primeira coisa que
vemos é uma lista privada que irá conter várias
coordenadas diferentes. Claro, esta é a classe que escrevemos no último vídeo. Como vemos aqui, cada navio requer sua
própria lista de coordenadas, então sabemos exatamente
onde elas estão. Agora também vemos todos os tamanhos possíveis de
navios aqui. E tenha em mente que
cada comentário que eu adiciono, como este aqui, esse bloco de comentários
aqui foi projetado para
ajudá-lo o máximo
possível e fornecer
algumas informações úteis do que está dentro
dessas funções. Mas aqui temos um método estático que retorna uma matriz inteira. Isso basicamente só
vai retornar 54332. E se eu for para o meu
programa e executá-lo novamente, aqui veremos uma nave
que tem cinco anos. Aqui vemos um navio de quatro longos,
mas é apenas uma vertical. Aqui vemos um longo demais
três e depois outros três. Então, se eu fosse adicionar
um navio de seis longos, e então eu executar esse
programa novamente. Agora vemos isso aqui. Isso determinará quantos navios diferentes
existem nos tamanhos de cada navio. Portanto, tenha isso em
mente avançando por padrão, eu tenho 54332. Agora, em seguida, temos
o construtor. E como isso tem
apenas uma linha de comprimento, não
consigo esconder a
funcionalidade de você, mas obviamente é muito simples. Estamos apenas recebendo uma lista
de coordenadas e estamos atribuindo isso à lista de
coordenadas locais aqui. Então também temos um getter
tanto para as coordenadas quanto a quantidade de
coordenadas que temos. Basicamente, obter o tamanho do navio, como ele
meio que descreve pelo nome. O que significa que aqui, esses três retornarão três listas para derrubar
duas e assim por diante. Agora, eles provavelmente são
autoexplicativos, mas
os próximos podem não ser. E, novamente, eu
encorajo você a dar uma olhada nos diferentes
comentários que adicionei. Por exemplo, este é o índice GET retorna um número inteiro e
leva em um quarto nele. E se você se lembrar corretamente, um índice é onde um
determinado elemento está dentro uma matriz ou uma lista começa em 0. Aqui está a descrição, isso retorna o índice
na lista de coordenadas onde
o cordão do períneo foi encontrado. Esta é a
coordenada do perímetro e estamos nos referindo à
lista de coordenadas aqui. Agora rolando para baixo, vemos que isso retorna
o índice de seu
presente ou seus retornos menos um. Se não estiver presente. Se você não conseguir encontrar o índice, então você deseja
retornar menos um. Agora, em seguida, vamos ver se isso já está em uso. Aqui ele verifica se uma
coordenada está dentro do navio. Aqui está uma dica. Use o método de índice GET. Essencialmente, get index deve retornar menos um
se não estiver em uso ou deve retornar outra
coisa se não for EUA. E então aqui temos uma função
mais complicada, que é verificar se uma determinada coordenada
seria um sucesso. Agora, a complexidade
dessa função vem de um, retornando uma matriz booleana. Essa matriz
manterá dois valores diferentes. O primeiro será
booleano, verdadeiro ou falso se for um sucesso. No segundo,
será um booleano, verdadeiro ou falso se
ele afundou o navio. Então, por exemplo, se eu adivinhar
algo e for uma falta, teremos falso e falso. Aqui vamos dizer que mes
é igual a falso e falso. Se for um sucesso, mas
não afundar o navio, haverá verdadeiro e falso. Se não afundar a nave, então ela
será verdadeira e verdadeira. Esses são os possíveis valores de
retorno quando se trata
da funcionalidade. Isso tem toda a funcionalidade
que um navio tem. Então vá em frente e pause este vídeo e tente adicionar
o máximo que puder, tente chegar o mais longe possível. E depois de
concluir tudo ou tentar o seu melhor e você realmente só precisa de ajuda extra. Em seguida, vá em frente e retome
o resto deste vídeo e vou examinar minha solução
para como fiz o navio. Tudo bem, então, começando no topo, aqui temos um índice GET. Este é o primeiro método oculto que eu ainda não passei. Então, vamos rever o que
isso está tentando fazer. Aqui. Temos argumentos de coordenadas
e estamos tentando ver onde exatamente isso está dentro da
nossa matriz de coordenadas, que foi armazenada localmente sua classe no topo bem aqui. Essencialmente, ele
retornará índice ou retornará menos um
se não conseguir encontrá-lo. Então, vamos
começar fazendo um loop através de cada coordenada individual
em nossa lista. Estamos dizendo que int a igual a 0, enquanto a é menor que
o tamanho da lista coronet, vamos aumentar um
bastante padrão for-loop. Aqui dentro. Vamos colocar nosso trimestre
alvo nele. E isso
mudará dependendo cada iteração do loop for. Ao passo que, em seguida,
basta
verificar se o valor x é igual ao valor-x alvo e o valor y é igual a
um valor yalvo. Se ambos forem verdadeiros, isso significa que essa é
a mesma coordenada exata. E nós queríamos retornar
ao índice atual, basicamente apenas retornando
um.Agora , se essa afirmação nunca
for verdadeira, então acabaremos sair desse loop inteiro. E, portanto,
vamos começar a retornar menos um, o que significa que não conseguimos encontrá-lo. Essa seria a função de índice
GET. Agora vamos passar para
a função de uso final, que basicamente
usa o método de índice. Aqui. Estamos criando um
booleano chamado está em uso e atribuição igual para obter aprovação de índice e coordenadas não é
igual a menos um. Então, menos um significa
que nada foi encontrado. E se algo fosse encontrado, isso significa que
algo entre 0 e o número total de
coordenadas seria retornado. Então, basicamente, se o índice não
for negativo, isso significa que é novidade. Agora podemos realmente
simplificar esse código. Eu escrevi em duas linhas separadas apenas para que eu possa minimizar isso, porque
as funções de linha única não podem ser minimizadas como vemos aqui. Se eu minimizar essa função, ainda
veremos o código. Então, voltando para
simplificar esse código, posso simplesmente retornar, obter índice, passar e coordenar não é
igual a menos um. Isso retornará verdadeiro
ou falso dependendo se essa coordenada não for
usada para a nave. Então aqui temos a função
mais complicada que foi atingida. E, novamente, isso retorna uma matriz
booleana onde o primeiro valor booleano
será se fosse um hit e um segundo valor booleano será se
achar que esse navio. Se eu expandir isso aqui, primeiro
vamos
obter o índice do nosso método
de índice GET. E se o índice
for menos um, isso significa que isso foi uma falta. Portanto, uma
falta deve retornar uma matriz booleana com
false e false, como vemos aqui. Aqui vemos esse negativo, que será o
mesmo negativo que é retornado se não
conseguirmos encontrar nada. Agora, depois disso, quando
chegarmos a esse código aqui, sabemos que
realmente acertamos alguma coisa. Agora o que ele diz, veja
se realmente afundamos aquela nave ou se é
apenas um golpe normal. Primeiro, vamos
obter a coordenada
nesse determinado índice e
vamos definir seu valor de
quadril como verdadeiro. Se você se lembra
na classe de coordenadas aqui temos esse sucesso booleano. E então agora estamos
atribuindo isso para verdade porque realmente
atingimos aquela parte da nave. Agora voltando para o navio aqui, vou criar
um booleano chamado
afundado e definir isso igual a verdadeiro. Essencialmente significando
que, por padrão vamos assumir que
o navio afundou. E então aqui
vamos percorrer todas as coordenadas
da nave. Se não for atingido, então o que quer dizer
que afundou é igual a
falso e nós vamos
sair desse loop. Então, essencialmente, todo esse
código faz aqui. É um assento se o navio tiver alguma coordenada restante
que não seja atingida. Se cada coordenada
do navio for atingida, então o navio afundará. Então, finalmente, podemos
retornar nossa matriz booleana. Neste ponto do
código aqui, sabemos que
houve um sucesso real. O primeiro booleano
é sempre verdadeiro, mas o segundo booleano será verdadeiro ou falso dependendo dele realmente afundou a
propriedade dependendo de sua lógica aqui. Esta será a função
de hit morto. E esta é provavelmente
a
função mais complicada da classe de navios. Mas espero que toda essa
explicação tenha feito sentido para você e espero que você tenha reduzido a
maior parte dessas
funcionalidades. Agora, é claro, na
programação existem muitas, muitas maneiras diferentes de escrever
esse mesmo tipo de código. Então, se o seu código
conseguir algo semelhante ao que o meu
faz, e se funcionar, então não se preocupe, se ele
parecer um pouco diferente, tudo bem,
desde
que ainda
faça a mesma coisa.
49. De jogador: Vamos dar uma olhada na classe
do jogador. Isso basicamente
só vai lidar com todas as naves para
um jogador específico. Agora, neste projeto, temos
apenas um jogador. Então, basicamente, é exatamente aqui que lidamos com
todos os navios. Então, vou mostrar algumas
partes do código de configuração básico. Mas quando se trata
da funcionalidade
real de como tudo funciona, eu encorajo
você a tentar usar meus exemplos aqui e vá em frente e escreva a
funcionalidade você mesmo, e depois venha de volta ao vídeo. Um deles te mostrou
meus próprios exemplos. Para começar, aqui
temos uma lista de navios, a classe de navios,
Isso é algo que
fizemos no vídeo anterior. Também temos um construtor aqui, que
receberá o tamanho da placa. Se formos ao meu arquivo principal, aqui vemos que estamos fazendo um novo jogador e estamos
passando o tamanho do tabuleiro. Agora, voltando, também
podemos devolver todos os navios, apenas um getter muito simples. Agora, avançando aqui
temos uma função aleatória. O objetivo disso é
atribuir aleatoriamente um ponto de partida para um navio, dependendo do
tamanho do tabuleiro e do tamanho do barco. Também deve se certificar que o barco pode realmente
caber no tabuleiro. Por exemplo, aqui temos
este barco de cinco longos. E se esse ponto de partida fosse, digamos J4, onde
realmente termina aqui. Então haverá
quatro personagens, haverá fora do tabuleiro. Não podemos ter isso. Então, queremos ter
certeza de que podemos realmente o barco na placa Akron. Agora, isso retorna um número inteiro
e a instrução de retorno diz a posição inicial para o navio
caber na placa. Por exemplo, se essa
posição inicial estivesse bem aqui, isso seria seis porque
G é equivalente a seis, estou apenas exibindo
letras aqui, então é fácil distinguir
se suas linhas ou colunas. Mas digamos que esteja
começando aqui. Seria seis e
isso não caberia toda
a prancha porque
este é um navio de cinco longos. Temos dez
colunas no total e dez linhas. Seis mais cinco é igual a 11. Então, nós saímos por um. Vai retornar
cinco em vez disso. Basicamente significa que
vamos nos ajustar para essa mudança para garantir que
a prancha se encaixe no barco. Agora avançando, Aqui, vamos ter coordenadas de
guitarra com uma coordenada inicial e
uma coordenada final. Isso
criará uma lista de coordenadas a partir de um ponto final
inicial. Um exemplo é um início de
zeros 0 e um fim de 03. Mas vamos retornar
seria 00010 para o objetivo isso é passar em
uma coordenada inicial aqui e uma
coordenada final aqui. E, em seguida,
retornará todas as coordenadas necessárias para
preencher o navio inteiro. Seguindo em frente
aqui temos está em uso ou basicamente vamos verificar uma coordenada e ver se algum navio vai
realmente usar isso. Então aqui colocamos navios, que é na verdade a função mais complicada
dentro desta classe. Vamos administrar a
nave, ela ganha tamanhos. Se eu for aqui
e isso retornará um novo array inteiro. No meu caso, tenho cinco tamanhos de navio
diferentes. Tenho cinco longos,
uh, por muito tempo. Duas instâncias de um navio de
três níveis
e, finalmente, um
navio longo A2 com eles jogador. Aqui vou executar tamanhos de pontos de
embarcação para obter todos os navios e
atribuir aleatoriamente se cada navio deve
ser vertical ou não. Se eu entrar na minha prancha aqui, veremos que cinco são horizontais. Mas esses três
aqui são verticais. Mas esses três
aqui são horizontais. Twitter atribuirá aleatoriamente um booleano vertical a cada navio individual que
vamos tentar criar. Também vamos
atribuir aleatoriamente uma coordenada inicial e adicionar o tamanho da nave para
obter a coordenada final. Por exemplo, aqui, essa
coordenada de RNA será cinco para, mas vamos
adicionar o tamanho do navio para obter a
coordenada final aqui. Isso vai ser 94. Tenha em mente que
a é basicamente 0, é por isso que J é nove. Em seguida, diz uma mistura
que todas as coordenadas permitem o navio se encaixe na placa e não está
sendo usado por outros navios. Você pode usar
métodos anteriores que
fizemos nesta classe para isso. Basicamente, certificando-se de que é uma coordenada única que realmente
funcionará. Então, finalmente, adicione o
navio resultante à lista de navios, que é declarada
aqui no topo. Agora aqui está uma dica. Os valores das coordenadas iniciais x e y devem ser randomizados. Então, por exemplo, isso aqui, essa coordenada 54, isso
será gerado aleatoriamente. Mas as coordenadas finais
x e y valores serão simplesmente o tamanho da nave adicionado à coordenada
inicial. Por exemplo, aqui
temos um navio de cinco longos. Então, vamos pegar
isso e adicionar cinco a ele. Obviamente contará isso
começando um como um e não 0. Então, basicamente vamos
acabar com um senhorio de cinco. Além disso, você só deve adicionar
ao x ou ao y, dependendo se for
vertical ou não. Nunca os dois. Então, basicamente aqui, isso tem uma nave horizontal, que significa que estamos
apenas adicionando ao y. vemos que o x é quatro. O tempo todo para este navio inteiro são apenas os
valores y que estão mudando. Por exemplo, f a j. Se formos adicionar
a ambos,
teríamos uma grade de cinco por cinco aqui com uma plataforma gigante, mas queremos uma
representação real de um navio. Isso vai ser
um pouco mais complicado, especialmente em uma
função de navios locais do que na última classe. Mas tente fazer o maior número possível
dessas coisas. E depois que
você sentir que foi o mais longe possível, ou depois de
concluir tudo, vá em frente e reproduza o
resto deste vídeo para que você
possa dar uma olhada no que
eu fiz pelas soluções. Vamos começar no topo
para a função aleatória. Se eu expandir isso aqui, vou começar
fazendo um inteiro aleatório. Com um valor máximo
do tamanho da placa. Neste caso, entre 09,
porque o tamanho da placa é dez. Então vou dizer, enquanto o número aleatório mais o tamanho do barco for
maior que o tamanho da placa, vou subtrair
o número aleatório. Então, vamos dar uma olhada neste navio de
cinco longos aqui. Se nosso número aleatório começou
aqui, que é seis, agora
sabemos que seis mais cinco, porque aleatoriedade seis barcos
heisst cinco neste caso, é maior do
que
o tamanho da placa de dez. Vamos continuar a subtrair até que ele realmente
se encaixe. Nesse caso, estamos
apenas subtraindo uma vez, dando-nos essa posição. E então vamos retornar
a nova posição inicial. Esta é uma solução para selecionar
aleatoriamente um ponto de
partida e
certificar-se de que o
ponto de partida realmente
funcionará quando se trata do tamanho do
barco e do tamanho da placa. Agora, em seguida,
temos todas as coordenadas. No início, vamos
fazer uma lista de coordenadas e também
retornaremos essa lista no final. Então temos que realmente
mudar ou modificar essa lista de coordenadas
para ter todos os
valores que queremos. Agora vamos
adicionar ao x ou ao y, dependendo se for
vertical ou horizontal. Aqui, primeiro estou começando verificando
se os valores x são os mesmos entre o início e
a coordenada y. Se dermos uma olhada
no barco, por exemplo, isso aqui mesmo, os valores x
são sempre os mesmos. Eles são sempre quatro. Portanto, isso tem
um barco horizontal. Então, com isso dito, preciso aumentar continuamente os valores y. Agora, aqui vou obter o valor ymínimo e
máximo. E vemos aqui que
estou usando apenas o Git. Por quê? Porque, novamente, os
valores x são sempre os mesmos. Em seguida, vou fazer um loop
através de todos os valores y. Vou adicionar
uma nova coordenada à lista de coordenadas
que fizemos aqui. Sempre usarei
o mesmo valor x exato, mas vou passar o
valor y de um loop for-loop. Dessa forma, a saída sempre é a mesma que deveria
ser para este barco, mas o valor y é a mudança de
voz. Agora, nesta instrução else, esse é exatamente o mesmo conceito, mas em vez do valor y
é para o valor x. Depois que estes forem executados, retornará a
lista de coordenadas. Seguindo
em frente, agora temos a função mais fácil aqui, que vai passar em uma coordenada e ver se alguma de nossas naves
vai usá-la. Então, basicamente, estamos
percorrendo todas as naves. Se não for usado, estamos
retornando verdade. Caso contrário, vamos
retornar false. Agora, avançando aqui temos a função mais
complicada, que é colocar todos os navios. Vamos começar
percorrendo
todas as
naves possíveis que queremos. Em seguida, vamos
atribuir aleatoriamente um booleano se isso
for vertical ou não. Em seguida, vamos criar
uma lista de coordenadas, mas ainda não vamos atribuir
nada a ela. Agora você pode ver uma palavra-chave ou ouvir que você
não está muito familiarizado. Por exemplo, o que
é esse cólon principal ou antes desse loop while? E o que estamos fazendo
exatamente aqui? Basicamente porque temos nosso loop principal e temos
um loop dentro dele. Com esse loop for-loop, preciso ter
certeza de rotular
cada loop corretamente. Por exemplo, se isso for verdade, quero continuar
em nosso loop while. Mas porque estou
dentro do for-loop, ele assumirá que estou continuando
no loop em si. Com isso dito, tenho que adicionar
um rótulo ao loop while. E então eu posso continuar esse loop específico
e não no loop for-loop. Vamos dar uma olhada no que
o loop for está fazendo. Primeiro de tudo, este
é um loop infinito, basicamente significando que
vamos executar continuamente todo esse código até
chegarmos a essa declaração de
quebra aqui. Então, à medida que eu começar, vou obter esses valores x e yiniciais. Em seguida, vou usá-los para criar coordenadas iniciais. Então eu vou obter
as coordenadas finais, mas não vou
aleatorizar essas coordenadas. Em vez disso, vou dizer que o
índice e o fim y serão
iguais ao início x ou
y mais o tamanho do barco. Se for um barco vertical, vamos pegar o x
inicial, e isso é tudo. Mas se não for
um barco vertical, vamos
pegar o x inicial e adicionar nos dois lados. Então é o
inverso para o fim. Por quê? Se for um barco vertical, vamos pegar o
y inicial e adicionar nos dois lados. Caso contrário,
vamos usar um Y. inicial e, em seguida, usaremos
esses dois valores para criar uma coordenada final. Em seguida, vamos atribuir um novo valor a esta lista de
coordenadas aqui. Esse valor será
o resultado das coordenadas da guitarra desde
o início e o fim. Isso pegará as coordenadas de início
e fim e tudo no meio
e as adicionará a uma lista. E esta é a função
que fizemos anteriormente. Agora, depois, vou
percorrer todas as novas
coordenadas que acabamos de obter, e vou me certificar de
que elas não estão em uso. Se eles não forem usados,
vamos saltar de volta
ao início do
loop while e basicamente
continuar tentando repetidas vezes até encontrar um monte de barcos que não
foram usados antes. Agora, se todos os barcos
encontramos nossos exclusivos, o que significa que eles não estão se
sobrepondo um sobre o outro. Neste loop for-loop vai simplesmente
passar por si mesmo e
continuará nessa declaração de
quebra. Agora, essa
instrução break
sairá de todo esse loop while. E então aqui vamos
criar um novo navio passando pelas
coordenadas que acabamos de receber, e depois passar o navio inteiro para a lista de navios aqui. Portanto, essa é definitivamente uma
das funções mais complicadas. Eu não acredito que sequer
cobrimos esses rótulos aqui, mas definitivamente existem
outras soluções que não exigem esses rótulos que ele pode ter
conseguido encontrar. Mas se você não foi capaz de obter o lugar naves ou qualquer
outra coisa na classe de jogadores. Não se preocupe, as
funções de locais que naves
foram especificamente mais complicadas do que a
maioria das coisas que
cobrimos até agora.
50. Terminando o jogo: Este será o último vídeo
sobre o projeto de encouraçado. Dentro deste vídeo,
vamos criar nossa aula de diretoria e
nossa aula de encouraçado. Então, vamos começar com a classe de
suporte, que estamos fazendo
um submarino da Nova Inglaterra dentro da nossa função principal. E aqui estamos passando
o tamanho do tabuleiro , bem
como o jogador que já
criamos. Agora, na aula de diretoria, vou examinar algumas funcionalidades
básicas, e depois vou
examinar os conceitos por trás dessas diferentes
funções aqui. Então você pode ir em frente e
tentar fazê-los por conta própria. E depois de ficar preso ou depois de concluir
a funcionalidade, você poderá ver como
minhas soluções ficam. Então, começando, temos um
número inteiro para o tamanho da placa. Isso simplesmente vem
do parâmetro real. Então também temos uma matriz de caracteres
multidimensional. Este será o quadro
real em si. Por exemplo, esse é o índice 0, índice um, o índice 10 e assim por diante. Em seguida, temos uma
lista de letras que tem todas as letras diferentes
para os identificadores de coluna. Então, basicamente, todas as letras
que vemos aqui em cima. Dessa forma, não temos um 00 como coordenada ou 10 como
coordenada onde
não está claro qual delas são as
colunas e qual delas são as linhas usando letras
deixa isso muito claro. Qual delas são as
colunas e linhas. Então temos acesso
a um jogador aqui, que também estamos apenas
obtendo dos perímetros. E então estamos apenas
atribuindo isso aqui. Primeiro estamos criando
um tabuleiro de jogo, que vamos dar uma
olhada aqui em um momento. E então vamos colocar as naves para criar
o tabuleiro de jogo. Isso preencherá
cada coordenada com o quadro com um determinado caractere
espacial. Por exemplo,
zeros de índice de placa, 0 é igual a espaço. Agora, é claro, você não
deve
atribuir manualmente cada um deles. Isso deve ser feito
através de um loop for-loop. Agora avançando, aqui
colocamos navios. Isso vai percorrer o ponto
do jogador obter navios. E para rever isso muito rápido, sob recebe navios aqui. Isso simplesmente retorna uma lista de todos os navios
anexados a este jogador. Então, vamos pegar todos
os navios com um jogador
e, em seguida, vamos
obter as
coordenadas dos navios para
obter os valores x e y. Se entrarmos na classe do navio, aqui vemos obter coordenadas. E isso simplesmente
retorna uma lista de todas as coordenadas
associadas a esse navio. Em seguida, vamos
atribuir o tamanho do navio como o personagem no
quadro X e no tabuleiro. Por quê? Por exemplo, aqui esses
cinco caracteres longos, cada
índice de placa individual, por exemplo, este, este
e assim por diante são chamados cinco porque este é o navio de
cinco longos aqui. Esta é a nave de quatro longas. Aqui temos a nave
três longa. Então, os personagens vão
ser o tamanho desse barco. Dessa forma, fica muito claro onde
o barco começa e pára. E aqui está uma dica. Um número inteiro contará
como um caractere, mas não da maneira
que você quiser. Você precisa converter o tamanho do ponto
de envio em uma string com valor de ponto de
string de e , em seguida, acessar o primeiro
caractere dos resultados. A razão para isso é porque cada
caractere individual
terá um número associado a terá um número associado ele quando se trata de
seu valor ascii, que basicamente será
apenas uma tabela do que cada caractere individual
no teclado representa
em um valor numérico. Você pode ir em frente e o valor ascii do
Google ou tabela
ascii para entender melhor
o que estou falando. Mas com isso dito, você precisa ter certeza de que
está realmente convertendo o tamanho do navio no número
real desejado, porque por padrão ele não
representará o número real. Mas, basicamente,
isso significa que o tamanho do
ponto de envio retornará um número
que você não está esperando. E então você precisa
convertê-lo em uma string primeiro com o valor de ponto de cadeia de caracteres de. Aqui vamos
obter um índice de letras. E você pode realmente
ver essa função aqui porque ela tem apenas
uma linha de comprimento. Mas vamos passar por cima disso muito rápido. Aqui vamos retornar ao valor
da América para cada
letra na matriz de letras. Então, estamos passando uma
determinada carta aqui. E esta é a alfabetização
pode ser índice de, e vamos
retornar o índice
dessa carta da matriz de
letras que definiria
uma fraude aparecer. Por exemplo, um
seria 0, e assim por diante. Agora, em seguida, vamos
tentar acertar certas coordenadas. Isso veria se uma coordenada
seria um sucesso ou não. Vamos passar o valor x e y da coordenada, e ela
retornará uma string. Se perdermos, ela
retornará a bagunça aqui. Se atingirmos, ele
retornará bem aqui. Se for um sucesso, isso
afundaria um navio, em vez disso voltaria, você afundou o navio de guerra deles. Agora, finalmente aqui
temos duas cordas. Sempre que estivermos imprimindo
um objeto no console, a
função
IF será chamada. Assim, podemos substituir esse
método para fazê-lo. Então, sempre que estivermos
imprimindo a placa no console , vamos imprimir
exatamente o
que queremos, que
será a pensão completa, como vemos aqui. Isso é impresso porque
nossa classe de navio amigo, sempre que
estivermos executando
o loop do jogo, vamos
imprimir o tabuleiro real, mas vamos cobrir isso
aqui em um momento. Isso vai
percorrer todas as
coordenadas do quadro e imprimirá os caracteres corretos
onde eles deveriam estar. E uma dica aqui é imprimir
os rótulos da coluna primeiro, que são as letras, como
você pode ver aqui. Em seguida, imprima cada
linha uma de cada vez, começando com o número da linha
e, em seguida, cada coordenada
dessa linha, vamos apenas
imprimir o número da linha. E então vamos
passar e adicionar cada coordenada individual. E tenha em mente que
essas linhas aqui, também conhecidas como pipes, são pressionando Shift e
pressionando o botão de barra invertida, que fica logo acima de Enter. Então eu tenho um espaço. Então eu tenho o conteúdo real para a coordenada individual, depois outro espaço
seguido de mais linhas. Portanto, esta função aqui
retornará uma string que representa
toda essa placa aqui. Esta será
toda a classe do conselho. Vá em frente
e tente fazer o máximo progresso possível sobre isso
e, em seguida, volte
e veja minhas soluções. E depois,
analisaremos os conceitos por trás
da classe de encouraçado, que só tem duas funções
principais. Mas, por enquanto, passe por cima da funcionalidade do quadro e
tente fazer o máximo possível. Tudo bem, espero
que você tenha conseguido adicionar a funcionalidade
para a classe de quadro, ou você conseguiu chegar o
mais longe possível. Vamos agora analisar
minha solução para saber como implementei
essas funcionalidades. Então, aqui
criamos o tabuleiro de jogo. Se eu expandir isso,
vamos
percorrer cada
matriz individual da placa. Portanto, cada
linha individual será uma matriz aninhada dentro da
matriz multidimensional aqui. Vou então preencher esta linha
inteira com um espaço. E se você criou um
loop aninhado para seguir em frente e fazer
isso, está perfeitamente bem também. Como mencionei
antes,
existem várias maneiras diferentes de
resolver cada problema quando
se trata de desenvolvimento de software. Se você escreveu esse
código, tudo bem. Se você escreveu um código semelhante
a ele, isso ainda funciona. Tudo bem também. Em seguida, vamos
olhar para navios de lugar. Se eu expandir isso,
vamos percorrer cada navio
que o jogador tiver. Então vamos
percorrer cada coordenada daquela nave. Vamos obter o valor x e y dessas coordenadas. E podemos atribuir índice
de placa XX e XY iguais a essa
expressão aqui. Isso remonta ao que eu
estava mencionando de usar o tamanho da nave passado
para o valor de ponto de cadeia de poeira porque estamos
procurando por um caractere específico e cada caractere individual
tem seu próprio valor inteiro. Como esta é uma matriz de
caracteres, não
podemos simplesmente atribuir
um inteiro a ela porque cada caractere individual no teclado é representado
por um número inteiro específico. E assumirá que
esse será realmente o caso. Por exemplo, o caractere 0 como representado por numérico 48, o caractere representado
por numérico 49 e assim por diante. O que queremos
fazer é garantir que estávamos usando a string
correta. Vamos
pegar o tamanho da nave e passá-lo para uma corda. Mas, claro, isso nos
dá uma
variável de string quando queremos
uma variável de caractere. Portanto, podemos simplesmente
acessar o char no índice 0, que há apenas
um índice porque tem apenas um valor de um
dígito. Mas, basicamente, isso
converterá o tamanho do navio de cinco no caractere cinco e depois atribuirá isso à
posição
correta do tabuleiro aqui. Então, isso passará por todos
os navios e basicamente colocará os 5 onde está
o navio de cinco longos. Os três são, o navio três
longo é e assim por diante. Agora, avançando aqui,
temos o índice Letter que foi abordado anteriormente
na linha única de código FSS. Seguindo em frente novamente, ele, vamos tentar
acertar certas coordenadas. Então, primeiro vamos
criar uma coordenada com o valor x e y. E então vamos
percorrer cada navio para
esse jogador exato. Se você se lembra
da classe de navio, temos uma função de hit
por ir para isso. Aqui, isso retornará uma matriz booleana onde o
primeiro valor será se for um hit e o segundo
valor será se ele afundar
o navio, false. Falso significa que foi uma bagunça. Verdadeiro falso significa que foi um sucesso, mas não afundou aquela nave. E verdade, verdade significa que ele bateu e
afundou aquela nave. Então, voltando ao meu quadro aqui, vou ter acesso
a todos os dados do hit. E então eu posso criar
dois booleanos separados. Ou acertou é índice
0 e pia vai ser index1 com zinco
foi ver se ele é verdade. Em caso afirmativo, vamos para X fora
dessa coordenada específica. Por exemplo, se eu
executar o programa aqui, posso selecionar B1 para
representar isso aqui. Posso inserir B1 e
ele muda esses três para um x porque
esse foi um hit real. E também retorna a
cadeia de caracteres aqui. Então, para fazer isso, aqui, vamos retornar se um
coletor usando um operador ternário, vamos nos devolver
pensar que eles são encouraçados,
mas, de outra forma,
vamos retornar ao golpe. E é
aqui que
vem a força que vemos em
nosso console bem aqui. Agora, depois desse loop for-loop, se nada realmente corresponder, isso significa que ele perdeu. Então, vamos simplesmente
retornar a string miss. Seguindo em frente aqui,
temos uma função toString. Isso basicamente
vai imprimir toda
a placa na tela. Vamos usar uma classe
StringBuilder. E não há nada de
errado em usar uma string normal e
apenas adicioná-la. Eles basicamente vão
fazer a mesma coisa. Mas estou usando um StringBuilder, que basicamente só me
permite adicionar mais coisas à
string de uma maneira mais limpa. Mas nos bastidores é basicamente apenas
adicionando uma string. Aqui estou começando
com esses espaços extras. Porque se eu for ao meu programa, é o que vemos aqui
com o texto destacado. Estes são os
espaços iniciais para garantir que os rótulos das colunas estejam
alinhados com cada coluna
individual. Então eu sou credito algo
conhecido como delimitador, que você pode
pensar como um separador. E este será um espaço
seguido por um cano, seguido por outro espaço. E é isso que vemos
aqui entre
cada personagem individual
para a coordenada exata. Em seguida, vou
adicionar um comentário. Vou dizer que
isso vai
ser adicionado nas colunas. Então, vou
percorrer o tamanho da placa porque as placas são
sempre um quadrado perfeito. Posso percorrer o
tamanho da placa duas vezes diferentes. Um para adicionar as colunas, um para adicionar as linhas e
o conteúdo individual. Aqui vou acrescentar as letras ponto get
a, que começará em 0 e percorrerá
todo o tamanho da placa, é por isso
que vemos
isso aqui. Agora posso percorrer
essa coisa toda. Em seguida, vamos anexar o delimitador
à string real, basicamente adicionando o espaço, o tubo e o espaço extra. Mas não queremos
fazer isso quando
se trata do último elemento aqui, como vemos, j não tem uma linha extra no final dela. Para verificar isso, podemos dizer que se um é menor que o
tamanho da borda menos um, se eu fosse mudar isso, e eu vou executar isso mais
uma vez, vamos ver uma
linha extra na borda de j. O que eu realmente não gosto, mas isso depende de você se
quisermos ter isso. Então vou mudar
isso de volta para o que era. Agora avançando. Depois de
adicionarmos todas as colunas, vamos adicionar uma nova linha usando o caractere de escape de quatro barras
n. A partir daqui. Em seguida, vai para a próxima linha
aqui embaixo. Agora, aqui vamos adicionar em cada linha individual e o conteúdo
real para o quadro. Então, essencialmente,
teremos um aninhado for-loop, fazendo um
loop através dele, basicamente duas vezes, um para os valores x e outro
para os valores y. Dentro deste aninhado por loop. Em seguida, vamos ter
a e B, que basicamente podem
representar x e y. Na verdade, para facilitar as coisas, vou clicar perto de a, e vou pressionar Shift
e F6 e renomear isso para x. Então eu vou fazer
a mesma coisa como ser shift e F6 e eu
posso mudar isso para y. Agora isso nos deixa
mais claros quando estamos acessando os valores do tabuleiro são basicamente apenas
percorrendo todo o x e coordenadas y para
os valores possíveis. Agora, uma coisa que eu quero
fazer é quando y é 0, isso significa que estamos no
início bem aqui. E, portanto, queremos adicionar
o número da linha, por
exemplo, 012 e assim por diante. Então, vamos adicionar isso
aqui, e então vamos
anexar o delimitador, sendo um espaço, espaço tubulação, que
vemos aqui. Agora, depois,
vamos adicionar cada personagem individual. Vamos adicionar no
quadro no índice X e no índice y. Aqui está 00, aqui está 01, é 0, aqui é 10, e assim por diante. Agora, a
maioria deles vai ser espaços, mas é claro, quando os
navios foram criados, eles foram colocados caracteres
aleatórios específicos com onde os barcos
deveriam realmente estar. Depois, estamos
simplesmente anexando o delimitador dessa forma depois de imprimir
este espaço aqui, teríamos outro
espaço com um tubo e outro espaço para criar algum espaço em branco para
facilita a leitura de tudo. E depois
vamos acrescentar uma nova linha. Isso vai para o que está
pegando essa linha
aqui e
envolvendo-a para a próxima linha. Então, no final
da função, retornaremos
resultados em toString, basicamente retornando a
string que acabamos de criar. Então isso é tudo
quando se trata da placa real e
impressão de coisas. Se isso foi
complicado para você, não se preocupe, isso é
completamente normal. Este projeto aqui
é designado para ter alguns aspectos fáceis e
alguns aspectos desafiadores. Se ele ficar preso nessas partes, não se preocupe, isso
perfeitamente normal. Mas agora que temos nossa classe de
diretoria criada, vamos para nossa aula de
encouraçado, e vamos dar uma olhada
nas duas funções finais que precisamos para
fazer tudo funcionar. Então, até agora criamos um
jogador e criamos um tabuleiro. E agora vamos correr,
executar loop de jogo passando
em nosso tabuleiro. Existem duas funções semelhantes
às demais deste projeto. Vou explicar
os conceitos por trás disso e então você pode
ir em frente e ver o que pode fazer com
esses conceitos e
depois verificar minha
solução em comparação com a sua. Então, aqui está uma descrição de como esse loop
de jogo vai funcionar. Vamos criar
um loop infinito que fará seis coisas
diferentes. A primeira é desenhar
o tabuleiro de jogo atual, basicamente apenas
imprimindo esse objeto de tabuleiro na tela porque
criamos uma
função toString aqui. Sempre que imprimimos um objeto de porta, ele executará essa função. Em seguida, vamos
imprimir a última ação. Então isso foi uma falta, um sucesso ou afundou o navio de guerra. Na verdade, vamos querer
criar essa string
mencionada aqui antes do nosso loop selvagem. Em seguida, vamos pedir ao
usuário coordenadas, ou eles podem inserir
a string sair. Como podemos ver aqui na parte inferior, insira
a coordenada. Aqui está um exemplo, ou
pare para parar de jogar. Se eu entrar sair, ele realmente
fechará o programa. Basicamente nos reunindo, vamos
voltar dessa função. Observe que quatro é o que
acabei de descrever. Saia do jogo. Se o encerramento
foi inserido, esses cinco. Agora é aqui que está a
maior parte da lógica. A etapa cinco é verificar
se a coordenação é válida. Basicamente, significa que ele vai ter personagens individuais. A primeira é uma letra válida que faz parte dessa
matriz aqui. E o segundo é um
número válido entre 09 se qualquer deles for falso ou
não for uma string longa de caracteres, ele continuará solicitando as
coordenadas corretas. Por exemplo, se eu executar
isso e eu entrar ou simplesmente um, ele
vai me perguntar novamente, se eu digitar Z 0, ele vai me perguntar
novamente, se eu inserir um 0, ele realmente funcionará. Tem que ser uma coordenada válida. E isso é realmente
o que vamos
fazer nesta próxima
função aqui. Mas vou descrever que,
assim que
chegarmos lá, primeiro verificaremos
se uma coordenada era válida. Em caso afirmativo, vamos tentar
acertar essas coordenadas. Em seguida, vamos armazenar
a última string de
ação para imprimi-la depois que a placa for exibida na
próxima iteração de loop. É por isso que
mencionei aqui. Basicamente, teremos
uma string antes de um loop while, mas vamos
avaliar o valor depois termos determinado
se é uma coordenada válida. E depois de tentarmos
acertar essa coordenada, dessa forma, quando
voltarmos ao início, vamos desenhar
o tabuleiro atual. Vamos imprimir
a última ação. Dessa forma, o tabuleiro do jogo
não o cobre e depois continuaremos. Se a coordenada não for válida, então vamos voltar para a etapa três, que está bem aqui. Peça ao usuário uma
entrada de coordenadas ou insira sair. Isso aqui é
o que vamos fazer
para fazer um loop de novo e de
novo e de novo, se eles não inserirem
uma coordenada válida. E é aqui que todas as partes do jogo se reúnem. Agora, esta função
aqui usará
esta próxima função, que
é uma coordenada válida. Vamos passar uma string, que será a entrada
real do usuário. Quando eu digito b5 aqui, a string B5 será inserida dentro desse
parâmetro aqui. Também vamos
ter uma prancha. E se olharmos para a descrição
exata aqui, isso verificará se a entrada
do usuário é válida. Agora, existem dois requisitos. A primeira é que deve ser
uma string de dois caracteres. A próxima é que
deve ser uma carta. É apenas um até J, seguido imediatamente por um número que é de 0 a nove apenas. Agora, aqui, a entrada da dica
é recebida e cadeias de caracteres. Portanto, obter um valor int
do segundo caractere, que deve ser de 0 a nove, não
atuará como
0 a nove. Em vez disso, ele vai agir
como se fossem valores do gráfico ascii, que mencionei
anteriormente neste vídeo. Isso significa que o caractere
0 seria igual ao inteiro 48 e o caractere um
seria igual ao inteiro 49, e assim por diante até que o caractere nove seja igual ao inteiro 57. Para verificar se a entrada de string
do segundo caractere
é de 0 a nove. Você realmente disse
verificar se o valor
inteiro é maior ou
igual a 48 e
menor ou igual a 57, basicamente significando que 0
é igual a 489 é igual a 57. Então, queremos estar dentro
desses dois valores aqui. Vá em frente e escreva a
funcionalidade para isso. Sugiro começar
com a
função de coordenadas válida porque é necessária para o loop do jogo. E depois
que você tiver feito isso, vá em frente e tente
enfrentar o loop do jogo. E depois você pode comparar suas
soluções com as minhas. Vamos começar com a
coordenada válida. Se eu expandir isso, aqui primeiro veremos se o comprimento da string não
é igual a dois. Se isso estiver correto, então
retornaremos false porque essa tem que ser uma string de
dois caracteres. Por exemplo, se eu digitar B5, que tem três caracteres, então vai me perguntar novamente, se eu entrei no teste, que
não tem dois caracteres. Vai me perguntar novamente, e continuará perguntando novamente até que eu insira
coordenadas válidas como J nove. Agora, obviamente, isso é uma bagunça,
mas realmente funcionou. Agora, depois, vou
criar uma matriz de caracteres para
separar as
coordenadas exatas nos caracteres individuais. A primeira coisa a ver
com essas informações é verificar se a
letra realmente existe. Board app.get Letter index,
como vemos aqui, ele retornará o índice de todas as nossas
letras aqui. O que
significa que, se não existir, ele retornará
menos um. Isso basicamente garantirá
que um através de J foi usado. Agora, se não for, simplesmente
retornaremos false. Mas se for usado,
vamos continuar e seguir em frente e verificar
os próximos valores, que estarão verificando
0 a nove. Aqui estamos criando
um número inteiro e uma string é igual
a um caractere. Lembre-se, array é
uma matriz de caracteres, o que significa que eles serão caracteres
individuais que têm números que os representam. Por exemplo, o caractere 0, representado pelo inteiro 48. caractere um é representado
pelo inteiro 49 e assim por diante. Na verdade, vamos nos
certificar de que isso é nove
vendo se o valor é
maior ou igual a 48 aniões. Se o valor for
menor ou igual a 57. Se essa condição
aqui for verdadeira, isso significa que
tudo está correto quando se trata da entrada
válida do usuário. Então, agora vamos rolar para
cima e vamos fazer a função final
para todo esse projeto, que é executado loop de jogo. Vou pegar todas as
funcionalidades e colocá-las juntas para
realmente ser utilizável. Se eu expandir isso, vamos
começar fazendo um scanner. E vamos
criar uma string, que é chamada de última ação. E estamos atribuindo
isso igual a nulo. Vamos atribuir
isso mais tarde. Esta será a
bagunça ou o golpe, ou os EUA afundaram sua corda de
encouraçado. E vamos seguir em
frente e fazer isso primeiro porque estamos querendo
imprimir o quadro. E logo
depois
vamos imprimir
a última ação. Dessa forma, ele não é
substituído automaticamente pela placa. Por exemplo, se eu fosse
imprimir isso antemão, uma hora para nos executar. Se eu inserir um 0, por exemplo, a
placa o cobre. Se eu rolar até aqui,
veremos a bagunça. Portanto, é por isso que precisamos criar uma string fora
do loop while. Portanto, ele não
será redefinido a cada vez, e podemos
imprimi-lo se realmente existir. Em seguida, vamos criar uma
string chamada coordenadas, e isso
receberá a entrada do usuário. Aqui temos um
loop do-while, que se você se lembrar, basicamente isso
executará esse código exato pelo menos
uma vez, não importa o que aconteça. Depois, ele
continuará a executar esse código, desde que essa
expressão aqui seja verdadeira. Então, vamos dar uma olhada no
que é esse código dentro. Aqui estamos imprimindo
as coordenadas internas,
por exemplo, um 0 ou sair
para parar de jogar. Em seguida, vamos obter a próxima palavra que o usuário digitar. E vamos converter
isso em maiúsculas. Então, qualquer coisa como uma minúscula 0 se tornaria Israel maiúscula. E isso nos torna mais fácil
comparar as coisas. Depois, vamos
simplesmente
ver se a entrada foi encerrado. Se assim for, vamos retornar
da função principal,
que, por sua vez, retornaria aqui e, em seguida,
sairá do programa principal. Mas, assumindo
que eles não entraram na saída, veremos se
é uma coordenada válida. Também vamos usar um operador
NOT aqui. Basicamente significa que se esta não for uma coordenada válida com a placa terminada do
cabo fornecida, continuaremos a viver
até que o usuário insira
uma coordenada válida. Mas se eles
inserirem coordenadas válidas, continuaremos e executaremos todo esse código aqui, começando obtendo
uma matriz de caracteres. E este é um
conceito semelhante ao que tínhamos antes com a função de
coordenadas válida, vamos obter uma matriz de
caracteres com índice 0 será a letra e índice um será
o número. Então, rolando de volta aqui,
vamos obter a coluna
que é o ponto do quadro get
Letter index, array index 0. Agora, obter o índice
disso basicamente vai
converter de um a J
em 0 a nove. O usuário vê um até J, mas o programa
na verdade não usa um através de J. Usamos números diferentes
para as colunas reais. Então, para 0 a nove. E esse é, na verdade, o índice de cada personagem individual. Se formos ao nosso quadro,
isso tem
índice 0, índice um,
até o índice nove. Obter o índice
dessa lista nos
dará a coordenada y
correta,
portanto, nos dando a coluna. Agora, para a linha,
vamos simplesmente pegar esse
caractere exato e vamos subtrair 48 pelas
mesmas razões
exatas que vemos aqui em baixo com
todos os exemplos ascii. Basicamente, o caractere 0 é igual a 48. Então, se subtrairmos 48, isso significa que
qualquer número
que temos será um número inteiro válido. Vai voltar aqui. A última ação será
igual ao tabuleiro para tentar acertar, passando na linha
e na coluna. E isso
chamará a função de tentativa de sucesso, que então
percorreria e veria se uma nave estava
realmente lá. E, em seguida, retorne uma corda, dependendo se eu realmente acertei ou se ela perdeu ou se
um santo aquele navio. E é assim que
todo esse programa funciona. Se eu executar isso mais uma vez, agora que vemos como
tudo funciona, agora
posso entrar no B3, por exemplo. E vai ficar em excesso. Se eu entrar b2, que está acima
dele, vai dizer senhorita. E posso continuar entrando em B4, B5. Finalmente, sejam seis. E agora diz, você
acha que eles são encouraçados? Porque todas as coordenadas
agora estão x fora dessa nave. E agora temos um jogo de
Battleship para um jogador completamente funcional, que construímos
juntos usando Java.
51. Conclusão: Isso conclui todo o meu curso
Java para iniciantes. Quero agradecer
por fazer o curso. E se quisermos
saber mais sobre o desenvolvimento
de
software dos meus tutoriais, faça o checkout do meu
canal do YouTube, as chaves desgastadas.