Introdução ao Java para iniciantes | Worn Off Keys | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


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

Introdução ao Java para iniciantes

teacher avatar Worn Off Keys

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Apresentação

      0:33

    • 2.

      Como instalar o IntelliJ

      2:23

    • 3.

      Olá mundo

      5:46

    • 4.

      Comentários

      1:20

    • 5.

      Variáveis

      6:57

    • 6.

      Entrada de usuário

      3:59

    • 7.

      Operadores aritméticos

      4:41

    • 8.

      Se mais se for mais

      7:28

    • 9.

      Declarações “switch”

      3:25

    • 10.

      Operadores de comparação

      2:02

    • 11.

      Operador lógico

      3:20

    • 12.

      Enquanto loops

      2:29

    • 13.

      Fazer quando se retira

      2:28

    • 14.

      Para loops

      1:56

    • 15.

      Quebra e continuar

      1:45

    • 16.

      Projeto de calculadora

      7:01

    • 17.

      Métodos

      5:26

    • 18.

      Sobrecarga de métodos

      1:35

    • 19.

      Escopo

      2:18

    • 20.

      Operador de trabalho

      2:08

    • 21.

      Arrays

      4:43

    • 22.

      Para cada loops

      2:03

    • 23.

      Arrays multidimensionais

      5:07

    • 24.

      Varargs

      2:38

    • 25.

      Constantes e fundição

      4:11

    • 26.

      Métodos de cordas comuns

      3:45

    • 27.

      Sequências de fuga

      2:18

    • 28.

      O Aula de matemática e números aleatórios

      3:55

    • 29.

      Variáveis primitivas em modelos de referência

      8:39

    • 30.

      Noções básicas de programação orientada por objetos

      4:43

    • 31.

      Construtores

      3:12

    • 32.

      A palavra-chave e propriedades

      4:19

    • 33.

      Encapsulamento, abstração, Getters e setters

      7:07

    • 34.

      Herança

      3:52

    • 35.

      Polimorfismo

      3:38

    • 36.

      A palavra-chave "estático"

      4:07

    • 37.

      Aulas abstratas

      3:20

    • 38.

      Interfaces

      3:21

    • 39.

      Exemplo de

      1:40

    • 40.

      Enums

      7:23

    • 41.

      Tente pegar finalmente

      5:36

    • 42.

      Erros de lançamento

      2:15

    • 43.

      Listas e listas de array

      6:25

    • 44.

      Mapas e mapas de hash

      4:14

    • 45.

      Como criar um arquivo de jar

      3:07

    • 46.

      Introdução do projeto de batalha

      1:13

    • 47.

      Arquivos e coordenadas

      2:33

    • 48.

      Navios

      8:09

    • 49.

      Jogador

      10:50

    • 50.

      Como terminar o jogo

      22:53

    • 51.

      Conclusão

      0:11

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

1.737

Estudantes

13

Projetos

Sobre este curso

Como aprender programação com Java?

Quando comecei a aprender Java em 2011, foi um pesadelo. Muitos novos conceitos e ideias para enrolar minha cabeça ao redor.

É por isso que fiz este curso: para criar um sistema passo a passo simples para aprender Java FAST.

Com vários projetos e explicações claras, este curso vai ajudar você a dominar fundamentos Java, mesmo que você nunca tenha programado antes.

Então, o que você está esperando? VAMOS COMEÇAR!

Conheça seu professor

Teacher Profile Image

Worn Off Keys

Professor

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

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

Visualizar o perfil completo

Level: Beginner

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

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.