<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: guilhermegarcia86</title>
    <description>The latest articles on DEV Community by guilhermegarcia86 (@guilhermegarcia86).</description>
    <link>https://dev.to/guilhermegarcia86</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F651647%2Ff1b5e47d-b17c-4f52-9525-bc0e0a14e742.jpeg</url>
      <title>DEV Community: guilhermegarcia86</title>
      <link>https://dev.to/guilhermegarcia86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/guilhermegarcia86"/>
    <language>en</language>
    <item>
      <title>Primeiros Passos no MIT App Inventor: Um Guia para Iniciantes</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Thu, 22 May 2025 22:19:48 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-no-mit-app-inventor-um-guia-para-iniciantes-156b</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-no-mit-app-inventor-um-guia-para-iniciantes-156b</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Se você é estudante de programação ou quer apenas criar aplicativos para Android ou iOS sem precisar aprender linguagens complexas de programação, o &lt;strong&gt;MIT App Inventor&lt;/strong&gt; é uma excelente porta de entrada. Esta plataforma gratuita permite desenvolver apps de forma visual, usando blocos lógicos e uma interface drag-and-drop (arrasta e solta).&lt;/p&gt;

&lt;p&gt;Neste artigo, você aprenderá como criar sua conta e iniciar seu primeiro projeto no MIT App Inventor, pronto para ser testado no seu celular.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o MIT App Inventor?
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://appinventor.mit.edu/" rel="noopener noreferrer"&gt;MIT App Inventor&lt;/a&gt; é uma ferramenta criada pelo Massachusetts Institute of Technology que permite a qualquer pessoa criar apps por meio de uma interface visual. É ideal para iniciantes, escolas técnicas, e projetos rápidos de prototipagem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uma conta Google (Gmail)&lt;/li&gt;
&lt;li&gt;Navegador (Chrome, Firefox, Edge, etc.)&lt;/li&gt;
&lt;li&gt;Smartphone com Android ou iOS para testes (opcional, mas recomendado)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Passo 1 – Acessando o site
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Acesse o site oficial: &lt;a href="https://appinventor.mit.edu" rel="noopener noreferrer"&gt;https://appinventor.mit.edu&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Clique no botão &lt;strong&gt;"Create apps!"&lt;/strong&gt; no canto superior direito.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-botao-create-apps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-botao-create-apps.png" title="Clique em 'Create apps!' para começar" alt="Botão Create apps do MIT App Inventor" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 2 – Fazendo login com o Google
&lt;/h2&gt;

&lt;p&gt;Você será redirecionado para a página de login do Google. Faça login com a conta que deseja usar para salvar seus projetos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Importante&lt;/strong&gt;: o MIT App Inventor salva seus projetos automaticamente na nuvem, vinculados à sua conta Google.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Passo 3 – Criando seu primeiro projeto
&lt;/h2&gt;

&lt;p&gt;Após o login:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clique em &lt;strong&gt;"New project"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-novo-projeto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-novo-projeto.png" title="Clique no botão New Project" alt="Botão novo projeto" width="433" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Digite um nome para o projeto, como &lt;code&gt;MeuPrimeiroApp&lt;/code&gt; (sem espaços ou acentos)&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;OK&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-janela-novo-projeto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-janela-novo-projeto.png" title="Digite um nome sem espaços e clique em OK" alt="Janela de novo projeto" width="440" height="336"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 4 – Conhecendo a interface
&lt;/h2&gt;

&lt;p&gt;Você será levado para a tela principal do editor, com duas abas importantes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Designer&lt;/strong&gt;: para montar a interface do app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocks&lt;/strong&gt;: para programar a lógica com blocos visuais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-interface.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-interface.png" title="Designer e Blocks são as áreas principais de edição" alt="Interface principal do MIT App Inventor" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste primeiro momento, seu projeto estará em branco. Isso é normal! A partir daqui, você poderá adicionar botões, campos de texto, listas e programar seus comportamentos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Passo 5 – Testando o app no celular
&lt;/h2&gt;

&lt;p&gt;Se quiser visualizar o app no seu celular:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Baixe o app &lt;strong&gt;MIT AI2 Companion&lt;/strong&gt; na Play Store ou App Store&lt;/li&gt;
&lt;li&gt;No MIT App Inventor, clique em &lt;strong&gt;"Connect" &amp;gt; "AI Companion"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Escaneie o QR code usando o app no celular&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-ai2companion.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fguilhermegarcia86%2Fguilhermecode.tech%2Frefs%2Fheads%2Fmain%2Fassets%2Fposts%2Fapp-inventor-ptI%2Fmit-app-inventor-ai2companion.png" title="Clique em AI Companion para exibir o QRCode" alt="Aba Connect" width="436" height="318"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Parabéns! Agora você está com sua conta criada e seu primeiro projeto em branco pronto para ser desenvolvido. A partir daqui, você pode começar a montar interfaces e adicionar lógica com blocos de programação.&lt;/p&gt;

&lt;p&gt;Nos próximos tutoriais, vamos mostrar como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adicionar itens em uma lista com TinyDB&lt;/li&gt;
&lt;li&gt;Criar apps de cadastro simples&lt;/li&gt;
&lt;li&gt;Trabalhar com variáveis e estruturas de decisão&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Dúvidas frequentes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Preciso instalar algo no computador?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não. Tudo é feito pelo navegador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Funciona no iPhone?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sim. Mas no iOS, você só pode testar via QR Code no app Companion — não é possível instalar o APK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preciso saber programar?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Não. O sistema usa blocos visuais, ideal para iniciantes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gostou do conteúdo?
&lt;/h2&gt;

&lt;p&gt;Se esse tutorial te ajudou, compartilhe com outras pessoas que também querem começar a programar! 🚀&lt;/p&gt;




</description>
      <category>programming</category>
      <category>mobile</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Primeiros passos com Java IX - Trabalhando com Enums</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Tue, 30 Nov 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-ix-trabalhando-com-enums-4lg6</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-ix-trabalhando-com-enums-4lg6</guid>
      <description>&lt;p&gt;Nos artigos anteriores estava sendo abordado o tema do básico de &lt;strong&gt;Programação Orientada a Objetos&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; ; porém existem outros tópicos da linguagem que seria bom serem apresentados. Iniciaremos com &lt;strong&gt;Enumerações&lt;/strong&gt; e no final desse artigo você será capaz de entender o que são, como criá-las e usar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enumerações&lt;/strong&gt; foram introduzidas no &lt;strong&gt;Java5&lt;/strong&gt; e são uma forma dos desenvolvedores trabalharem melhor com dados que não podem ser alterados do que usando &lt;strong&gt;constantes&lt;/strong&gt; , ela foi introduzida como sendo um tipo novo na linguagem o que significa que os desenvolvedores ganharam uma forma de checagem de tipos em tempo de compilação, o que ajuda muito no desenvolvimento principalmente por que possíveis erros são apontados no momento em que estamos escrevendo o código ao invés de só perceber, se perceber, o erro quando o código já está rodando e sendo usado. Juntamente com a tipagem foi adicionado um pacote novo, o &lt;strong&gt;java.lang.Enum&lt;/strong&gt; e com isso uma série de métodos foram herdados quando uma &lt;strong&gt;Enum&lt;/strong&gt; é criada.&lt;/p&gt;

&lt;p&gt;Para entender a motivação para adicionar &lt;strong&gt;Enums&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; vamos supor que temos um código que valida o dia da semana, sabemos que os nomes dos dias da semana são imutáveis então podemos criar &lt;strong&gt;constantes&lt;/strong&gt; para isso da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class DiaDaSemana {

    public static final String DOMINGO = "DOMINGO";
    public static final String SEGUNDA = "SEGUNDA";
    public static final String TERCA = "TERCA";
    public static final String QUARTA = "QUARTA";
    public static final String QUINTA = "QUINTA";
    public static final String SEXTA = "SEXTA";
    public static final String SABADO = "SABADO";

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tendo em mãos as &lt;strong&gt;contantes&lt;/strong&gt; podemos criar o método que lida com o dia da semana e a partir dele toma alguma decisão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void avaliaDiaDaSemana(String diaDaSemana){
    switch (diaDaSemana){
        case DiaDaSemana.DOMINGO:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO DOMINGO");
            break;
        case DiaDaSemana.SEGUNDA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEGUNDA");
            break;
        case DiaDaSemana.TERCA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA TERCA");
            break;
        case DiaDaSemana.QUARTA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUARTA");
            break;
        case DiaDaSemana.QUINTA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUINTA");
            break;
        case DiaDaSemana.SEXTA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEXTA");
            break;
        case DiaDaSemana.SABADO:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO SABADO");
            break;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima foi feito uso de um &lt;strong&gt;switch-case&lt;/strong&gt; sem uma cláusula &lt;strong&gt;default&lt;/strong&gt; pois o desenvolvedor assumiu que como esse método sempre vai receber dias da semana não haveria o por que adicionar um &lt;strong&gt;default&lt;/strong&gt; pois não seria executado. Agora vamos simular um caso de uso e testar essa hipótese:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void main(String[] args) {

    String diaDaSemana = "JANEIRO";

    avaliaDiaDaSemana(diaDaSemana);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar esse código nada será impresso pois houve uma falha no dado de entrada e isso não ficou explícito em nenhum ponto do código, uma possível solução aqui seria adicionar o &lt;strong&gt;default&lt;/strong&gt; porém só estaríamos contornando o problema pois esse método permite a entrada de &lt;strong&gt;Strings&lt;/strong&gt; mas no desenvolvimento nós queremos apenas dias da semana como uma entrada válida e se tentassem passar qualquer valor que não seja um dia da semana não poderia ser executado, graças as &lt;strong&gt;Enums&lt;/strong&gt; isso se torna possível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando Enums
&lt;/h2&gt;

&lt;p&gt;Criar uma &lt;strong&gt;Enum&lt;/strong&gt; é como criar uma &lt;strong&gt;classe&lt;/strong&gt; porém utilizamos a palavra reservada &lt;strong&gt;enum&lt;/strong&gt; , para ficar claro o código abaixo é a criação de uma &lt;strong&gt;Enum&lt;/strong&gt; representando os dias da semana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public enum DiaDaSemana {
    DOMINGO,
    SEGUNDA,
    TERCA,
    QUARTA,
    QUINTA,
    SEXTA
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foi criado uma &lt;strong&gt;Enum&lt;/strong&gt; simples e iremos evoluí-la ao passar do artigo e ver outras vantagens que ganhamos com iso. Uma &lt;strong&gt;enum&lt;/strong&gt; carrega consigo um valor que por padrão é o próprio nome do item na &lt;strong&gt;Enum&lt;/strong&gt; , então conseguimos fazer validações do tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System.out.println(DiaDaSemana.valueOf("DOMINGO"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;valueOf&lt;/strong&gt; que vem herdado do pacote &lt;strong&gt;java.lang.Enum&lt;/strong&gt; retorna o item da &lt;strong&gt;Enum&lt;/strong&gt; correspondente se o valor combinar com algum valor da &lt;strong&gt;Enum&lt;/strong&gt; ou lança uma &lt;strong&gt;exceção&lt;/strong&gt;  &lt;strong&gt;IllegalArgumentException&lt;/strong&gt; caso não encontre nenhum valor que combine com a &lt;strong&gt;String&lt;/strong&gt; informada, você pode ter notado que bastou adicionar a palavra &lt;strong&gt;enum&lt;/strong&gt; e automaticamente ganhamos vários métodos como o &lt;strong&gt;valueOf&lt;/strong&gt; , &lt;strong&gt;name&lt;/strong&gt; , &lt;strong&gt;ordinal&lt;/strong&gt; e etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando Enums
&lt;/h2&gt;

&lt;p&gt;Agora vamos alterar o método &lt;strong&gt;avaliaDiaDaSemana&lt;/strong&gt; para trabalhar com a &lt;strong&gt;Enum DiaDaSemana&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public static void avaliaDiaDaSemana(DiaDaSemana diaDaSemana){
    switch (diaDaSemana){
        case DOMINGO:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO DOMINGO");
            break;
        case SEGUNDA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEGUNDA");
            break;
        case TERCA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA TERCA");
            break;
        case QUARTA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUARTA");
            break;
        case QUINTA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUINTA");
            break;
        case SEXTA:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEXTA");
            break;
        case SABADO:
            System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO SABADO");
            break;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o método recebe a &lt;strong&gt;Enum DiaDaSemana&lt;/strong&gt; e não há como passar outro valor que não seja um &lt;strong&gt;DiaDaSemana&lt;/strong&gt; para o método &lt;strong&gt;avaliaDiaDaSemana&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;avaliaDiaDaSemana(DiaDaSemana.DOMINGO);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tentarmos usar outro tipo que não seja um &lt;strong&gt;DiaDaSemana&lt;/strong&gt; o código não irá compilar e se forçarmos o uso de outro valor será lançada uma &lt;strong&gt;Exception&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Não compila
avaliaDiaDaSemana("OutroValor");

//IllegalArgumentException
avaliaDiaDaSemana(DiaDaSemana.valueOf("DIA QUE NÃO EXISTE"));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Atributos e métodos com Enums
&lt;/h2&gt;

&lt;p&gt;Vimos o exemplo de como criar uma &lt;strong&gt;Enum&lt;/strong&gt; do jeito mais simples possível, porém &lt;strong&gt;Enums&lt;/strong&gt; podem ter atributos e métodos associados a elas. Isso ocorre pois uma &lt;strong&gt;Enumeração&lt;/strong&gt; se comporta como se fosse uma classe estática, uma classe que não pode ser instanciada, então se é uma classe é possível existir atributos e métodos, a própria utilização de uma &lt;strong&gt;Enum&lt;/strong&gt; se assemelha ao uso de um método estático, exemplo: &lt;strong&gt;DiaDaSemana.DOMINGO&lt;/strong&gt;. Por conta disso caso seja necessário ter métodos ou atributos que auxiliem na execução de &lt;strong&gt;Enums&lt;/strong&gt; podemos adicionar da seguinte maneira, começando pelo atributos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public enum DiaDaSemana {
    DOMINGO("Domingo"),
    SEGUNDA("Segunda"),
    TERCA("Terça"),
    QUARTA("Quarta"),
    QUINTA("Quinta"),
    SEXTA("Sexta"),
    SABADO("Sábado");

    private String nome;

    DiaDaSemana(String nome){
        this.nome = nome;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como &lt;strong&gt;Enums&lt;/strong&gt; se comportam como classes, com a exceção de que não podem ser instanciadas, podemos criar atributos mas para ligá-los ao itens da &lt;strong&gt;Enum DiaDaSemana&lt;/strong&gt; é necessário que esses itens, da &lt;strong&gt;Enum&lt;/strong&gt; , estejam instanciados dentro da &lt;strong&gt;Enum&lt;/strong&gt; e para isso foi criado um construtor, que não é público, fazendo a ligação do atributo &lt;strong&gt;nome&lt;/strong&gt; para cada item no &lt;strong&gt;Enum&lt;/strong&gt; e por fim foi criado um valor para cada um deles.&lt;/p&gt;

&lt;p&gt;Para criar métodos em &lt;strong&gt;Enums&lt;/strong&gt; é o mesmo que criar métodos em classes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public String getNome(){
    return this.nome;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A utilização dos métodos é muito parecido com o que vemos em métodos estáticos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System.out.println(DiaDaSemana.DOMINGO.getNome());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o resultado é o atributo nome que está associado ao item &lt;strong&gt;DOMINGO&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domingo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para esclarecer um pouco mais vamos criar outro método para verificar se o dia é final de semana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public boolean verificaFinalDeSemana(){
    if(this == SABADO || this == DOMINGO){
        return true;
    }

    return false;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método acima verifica se o dia testado é um sábado ou domingo e retorna um &lt;strong&gt;true&lt;/strong&gt; caso seja e um &lt;strong&gt;false&lt;/strong&gt; caso não seja, perceba que é passado o operador &lt;strong&gt;this&lt;/strong&gt; e ele se refere a instancia do item do &lt;strong&gt;Enum&lt;/strong&gt; que irá chamar o método &lt;strong&gt;verificaFinalDeSemana&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System.out.println(DiaDaSemana.SEGUNDA.verificaFinalDeSemana());
System.out.println(DiaDaSemana.SABADO.verificaFinalDeSemana());
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então quando o &lt;strong&gt;Enum DiaDaSemana.SEGUNDA&lt;/strong&gt; chamar o método &lt;strong&gt;verificaFinalDeSemana&lt;/strong&gt; o &lt;strong&gt;this&lt;/strong&gt; se refere a &lt;strong&gt;SEGUNDA&lt;/strong&gt; e assim em todos os itens da &lt;strong&gt;Enum&lt;/strong&gt; , rodando esse código o resultado é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;false
true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Quando se trabalha com &lt;strong&gt;Enum&lt;/strong&gt; na maioria das vezes é por que existe uma coleção de dados que devem constante e queremos que isso seja garantido, &lt;strong&gt;Enums&lt;/strong&gt; suprem muito bem essa necessidade. Existem outras maneiras de trabalhar com &lt;strong&gt;Enums&lt;/strong&gt; como &lt;strong&gt;EnumSet&lt;/strong&gt; e &lt;strong&gt;EnumMap&lt;/strong&gt; porém esses são tópicos mais avançados de &lt;strong&gt;Enums&lt;/strong&gt; e não tão comumente usados no dia-a-dia, porém com o que foi passado você será capaz de entender quando usar &lt;strong&gt;Enums&lt;/strong&gt; e como usá-las para tirar o máximo proveito possivel delas.&lt;/p&gt;

&lt;p&gt;O código deste artigo se encontra no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Primeiros passos com Java VIII - Polimorfismo e Interface</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Wed, 17 Nov 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-viii-polimorfismo-e-interface-58me</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-viii-polimorfismo-e-interface-58me</guid>
      <description>&lt;h2&gt;
  
  
  Polimorfismo e Interface
&lt;/h2&gt;

&lt;p&gt;No último &lt;a href="https://dev.to/guilhermegarcia86/primeiros-passos-com-java-vii-459a"&gt;artigo&lt;/a&gt; foi mostrado a &lt;strong&gt;Herança&lt;/strong&gt; e como podemos fazer uso de &lt;strong&gt;Classes Abstratas&lt;/strong&gt; , para criar estruturas que podem ser usadas para realizar &lt;strong&gt;Herança&lt;/strong&gt; mas sem que sejam criadas classes a partir delas. Agora vamos abordar o tema &lt;strong&gt;Polimorfismo&lt;/strong&gt; e como é importante esse conhecimento para se trabalhar de forma orientada a objetos com &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Polimorfismo&lt;/strong&gt; significa múltiplas formas e aqui veremos como podemos tirar vantagem de um código que pode assumir muitas formas e deixar todo o processamento mais fluído e flexível.&lt;/p&gt;

&lt;p&gt;Ao fim desse artigo você será capaz de saber usar e identificar o &lt;strong&gt;Polimorfismo&lt;/strong&gt; em seu código e também estará ciente das vantagens que esse recurso trás.&lt;/p&gt;

&lt;p&gt;Antes mesmo de entrar no assunto de &lt;strong&gt;Polimorfismo&lt;/strong&gt; é extremamente importante entender o que é uma &lt;strong&gt;Interface&lt;/strong&gt; na &lt;strong&gt;Java&lt;/strong&gt; , pois é um recurso muito usado em conjunto com &lt;strong&gt;Polimorfismo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma &lt;strong&gt;Interface&lt;/strong&gt; é um contrato que define “esqueletos” de métodos para que sejam implementados por classes. Muito similares com a ideia de &lt;strong&gt;Classes Abstratas&lt;/strong&gt; , é uma estrutura que não pode ser instanciada porém existem diferenças entre &lt;strong&gt;Interfaces&lt;/strong&gt; e &lt;strong&gt;Classes Abstratas&lt;/strong&gt; e iremos ver algumas no decorrer do artigo.&lt;/p&gt;

&lt;p&gt;Voltando ao exemplo base que está sendo usado nos outros artigos, a nossa aplicação bancária possui uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; que se refere a uma &lt;strong&gt;Conta&lt;/strong&gt; e não faz sentido nessa aplicação que seja possível criar uma conta sem dizer se é de pessoa física ou jurídica, então a classe &lt;strong&gt;Conta&lt;/strong&gt; foi definida como uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; onde através de &lt;strong&gt;Herança&lt;/strong&gt; foi definido classes filhas ou sub-classes de &lt;strong&gt;Conta&lt;/strong&gt; ( &lt;strong&gt;PessoaFisica&lt;/strong&gt; e &lt;strong&gt;PessoaJuridica&lt;/strong&gt; ), então podemos concluir que as classes &lt;strong&gt;PessoaFisica&lt;/strong&gt; e &lt;strong&gt;PessoaJuridica&lt;/strong&gt; são do mesmo tipo da classe &lt;strong&gt;Conta&lt;/strong&gt; já que são filhas e isso é chamado de relacionamento &lt;strong&gt;É-UM&lt;/strong&gt; onde a classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; é considerada uma &lt;strong&gt;Conta&lt;/strong&gt;. Podemos definir outro tipo de relacionamento no &lt;strong&gt;Java&lt;/strong&gt; onde a classe também será do tipo &lt;strong&gt;É-UM&lt;/strong&gt; porém com uma ideia mais voltada para a capacidade que essa classe irá possuir e fazemos isso com &lt;strong&gt;Interface&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para ficar mais claro vamos criar uma &lt;strong&gt;Interface&lt;/strong&gt; que será responsavel pelos serviços de financiamentos, vamos chamá-la de &lt;strong&gt;Financiamento&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Financiamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;pegaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;liberaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código anterior foi definido dois métodos, um chamado &lt;em&gt;pegaEmprestimo&lt;/em&gt; que recebe uma &lt;strong&gt;Conta&lt;/strong&gt; como argumento e devolve um &lt;strong&gt;boolean&lt;/strong&gt; e outro chamado &lt;em&gt;liberaEmprestimo&lt;/em&gt; que também recebe uma &lt;strong&gt;Conta&lt;/strong&gt; e devolve um &lt;strong&gt;BigDecimal&lt;/strong&gt; que seria referente ao valor do emprestimo liberado. Podemos ver que uma &lt;strong&gt;Interface&lt;/strong&gt; define os contratos de métodos porém não provê uma implementação, também não foi passado nenhum modificador de acesso, porém no caso de interfaces isso não significa que esses métodos sejam &lt;strong&gt;default&lt;/strong&gt; como vimos em artigos anteriores, nesse caso não precisamos informar mas todo método em uma &lt;strong&gt;Interface&lt;/strong&gt; é automaticamente &lt;strong&gt;public&lt;/strong&gt; e &lt;strong&gt;abstract&lt;/strong&gt; sempre.&lt;/p&gt;

&lt;p&gt;Com a &lt;strong&gt;Interface&lt;/strong&gt; criada iremos criar uma classe chamada &lt;strong&gt;Banco&lt;/strong&gt; e iremos fazer com que essa classe possa ter a capacidade de fornecer financiamentos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Financiamento&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Banco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;pegaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;nextBoolean&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;liberaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pegaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;divide&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;    
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getContas&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contas&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo temos a classe &lt;strong&gt;Banco&lt;/strong&gt; e quando queremos usar &lt;strong&gt;Interfaces&lt;/strong&gt; adicionamos a palavra reservada &lt;strong&gt;implements&lt;/strong&gt; que como o próprio nome diz irá implementar aquela &lt;strong&gt;Interface&lt;/strong&gt; e criar um relacionamento entre a &lt;strong&gt;Classe&lt;/strong&gt; e a &lt;strong&gt;Interface&lt;/strong&gt; , também foi necessário implementar os métodos &lt;em&gt;pegaEmprestimo&lt;/em&gt; e &lt;em&gt;liberaEmprestimo&lt;/em&gt;, onde o &lt;em&gt;pegaEmprestimo&lt;/em&gt; só devolve um &lt;strong&gt;boolean&lt;/strong&gt; aleatório e o método &lt;em&gt;liberaEmprestimo&lt;/em&gt; que se baseia no retorno do &lt;em&gt;pegaEmprestimo&lt;/em&gt; para saber a quantidade que será liberada de crédito, caso a analise de crédito retorne um &lt;strong&gt;true&lt;/strong&gt; ele poderá pegar o valor total solicitado e caso retorne &lt;strong&gt;false&lt;/strong&gt; poderá pegar a metade.&lt;/p&gt;

&lt;p&gt;Podemos começar a ver um pouco de &lt;strong&gt;Polimorfismo&lt;/strong&gt; nesse código onde os métodos &lt;em&gt;pegaEmprestimo&lt;/em&gt; e &lt;em&gt;liberaEmprestimo&lt;/em&gt; recebem como argumento uma &lt;strong&gt;Conta&lt;/strong&gt; sem fazer distinção se é uma conta de pessoa física ou jurídica e se por acaso no futuro existir outro tipo de conta esse código está preparado para recebê-lo, o que torna o nosso código mais flexível e desacoplado das implementações como &lt;strong&gt;PessoaFisica&lt;/strong&gt; ou &lt;strong&gt;PessoaJuridica&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Agora podemos criar uma instância de &lt;strong&gt;Banco&lt;/strong&gt; e fazer as operações de &lt;strong&gt;Financiamento&lt;/strong&gt; para as &lt;strong&gt;Contas&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaJuridica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Empresa do Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="n"&gt;banco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MeuBanco"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valorLiberado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;banco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;liberaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1000"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor liberado %s para conta %s"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;formatted&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorLiberado&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="n"&gt;valorLiberado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;banco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;liberaEmprestimo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"10000"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor liberado %s para conta %s"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;formatted&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorLiberado&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicando o código acima, primeiramente criamos duas classes, uma para &lt;strong&gt;PessoaFisica&lt;/strong&gt; e outra para &lt;strong&gt;PessoaJuridica&lt;/strong&gt; porém as duas foram atribuídas para variáveis do tipo &lt;strong&gt;Conta&lt;/strong&gt; , isso também é o &lt;strong&gt;Polimorfismo&lt;/strong&gt; em ação pois como foi dito anteriormente tanto a classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; quanto &lt;strong&gt;PessoaJuridica&lt;/strong&gt; são filhas ou sub-classes da classe &lt;strong&gt;Conta&lt;/strong&gt; e por isso podemos referenciar dessa maneira, e podemos passar para o método &lt;strong&gt;liberaEmprestimo&lt;/strong&gt; uma &lt;strong&gt;PessoaFisica&lt;/strong&gt; ou &lt;strong&gt;PessoaJuridica&lt;/strong&gt; que são uma &lt;strong&gt;Conta&lt;/strong&gt; também, porém poderíamos passar uma variável do tipo &lt;strong&gt;PessoaFisica&lt;/strong&gt; ou &lt;strong&gt;PessoaJuridica&lt;/strong&gt; pois como dissemos elas também são do tipo &lt;strong&gt;Conta&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um ponto diferente entre &lt;strong&gt;Interfaces&lt;/strong&gt; e &lt;strong&gt;Classes Abstratas&lt;/strong&gt; é que pode haver múltiplas implementações de &lt;strong&gt;Interfaces&lt;/strong&gt; para uma classe, coisa que não pode acontecer com &lt;strong&gt;Classes Abstratas&lt;/strong&gt; já que não existe &lt;strong&gt;Herança&lt;/strong&gt; múltipla no &lt;strong&gt;Java&lt;/strong&gt; mas com &lt;strong&gt;Interfaces&lt;/strong&gt; podemos adicionar esse comportamento e para exemplificar isso iremos criar outra &lt;strong&gt;Interface&lt;/strong&gt; para serviços de transferências do banco:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Transferencia&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;realizaTransferencia&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;origem&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;destino&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos uma &lt;strong&gt;Interface&lt;/strong&gt;  &lt;strong&gt;Transferencia&lt;/strong&gt; com um método &lt;strong&gt;realizaTransferencia&lt;/strong&gt; que recebe a &lt;strong&gt;Conta&lt;/strong&gt; de origem, a &lt;strong&gt;Conta&lt;/strong&gt; de destino e o valor da transferência, e aqui fica bem claro a ideia de &lt;strong&gt;Polimorfismo&lt;/strong&gt; já que não amarramos uma transferência para uma conta jurídica ou física; vamos adicionar essa funcionalidade na classe &lt;strong&gt;Banco&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Financiamento&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;//TODO O RESTO OMITIDO&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;realizaTransferencia&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;origem&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;destino&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;valorSacado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;origem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saca&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;destino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deposita&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valorSacado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como visto no código acima para fazer a implementação de múltiplas &lt;strong&gt;Interfaces&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; basta adicioná-las após a palavra &lt;strong&gt;implements&lt;/strong&gt; separadas por vírgula. Nesse exemplo foi implementado a transferência entre contas onde basicamente é feito o saque de uma conta e o depósito em outra, como fazemos uso do &lt;strong&gt;Polimorfismo&lt;/strong&gt; nesse caso não ficamos amarrados ou presos a detalhes de implementação de como as contas fazem esse procedimento, após declararmos o que queremos que seja feito sabemos que as implementações irão executar suas responsabilidades. Foram feitos alguns ajustes para que esse lógica funcionasse, primeiramente olhando a classe &lt;strong&gt;Conta&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Conta&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"1000"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foi adicionado o atributo &lt;strong&gt;saldo&lt;/strong&gt; que também foi adicionado ao construtor da classe &lt;strong&gt;Conta&lt;/strong&gt; para que na inicialização aja saldo com valor de 1000 quando uma conta nova é criada, uma observação é que mesmo não podendo criar uma instância de uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; podemos ter um construtor que será usado pelas classe filhas, já nas classes &lt;strong&gt;PessoaFisica&lt;/strong&gt; e &lt;strong&gt;PessoaJuridica&lt;/strong&gt; foi adicionado ao construtor a chamada para o construtor da classe mãe. E adicionamos a lógica para subtrair ou adicionar ao saldo quando ocorrer um saque ou um depósito, segue o exemplo na classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;TIPO_DE_DOCUMENTO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CPF"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="c1"&gt;//CHAMADA AO CONSTRUTOR DA CLASSE MÃE&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;documento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;TIPO_DE_DOCUMENTO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;saca&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SAQUE PARA PESSOA "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" COM DOCUMENTO "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;//LÓGICA PARA ADICIONAR AO SALDO&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subtract&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;deposita&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEPOSITANDO PARA PESSOA "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" COM DOCUMENTO "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;//LÓGICA PARA SUBTRAIR DO SALDO&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As mudanças no código foram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No construtor foi adicionado uma chamada ao construtor da classe mãe através do &lt;strong&gt;super()&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Tanto no método &lt;strong&gt;saca&lt;/strong&gt; quanto no &lt;strong&gt;deposita&lt;/strong&gt; foi chamado o atributo saldo para adicionar fundos, no método &lt;strong&gt;saca&lt;/strong&gt; , ou para subtrair fundos, método &lt;strong&gt;deposita&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E agora executando esse código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaJuridica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Empresa do Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="n"&gt;banco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MeuBano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="n"&gt;banco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;realizaTransferencia&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"10"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teremos como saída o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Conta&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Guilherme'&lt;/span&gt;, &lt;span class="nv"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'CPF'&lt;/span&gt;, &lt;span class="nv"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;990&lt;span class="o"&gt;}&lt;/span&gt;
Conta&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Empresa do Guilherme'&lt;/span&gt;, &lt;span class="nv"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'CNPJ'&lt;/span&gt;, &lt;span class="nv"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1010&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma novidade que passou a existir a partir do &lt;strong&gt;Java 8&lt;/strong&gt; foi a possibilidade de haver um método implementado em uma &lt;strong&gt;Interface&lt;/strong&gt; , antes só as &lt;strong&gt;Classes Abstratas&lt;/strong&gt; poderiam possuir métodos implementados. Vamos ver isso em ação criando uma &lt;strong&gt;Interface&lt;/strong&gt; para &lt;strong&gt;Auditoria&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Auditoria&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;audita&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"REALIZANDO AUDITORIA"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;strong&gt;Interface&lt;/strong&gt;  &lt;strong&gt;Auditoria&lt;/strong&gt; possui um método chamado &lt;em&gt;audita&lt;/em&gt; e este método já possui uma implementação e indicamos isso através da palavra &lt;strong&gt;default&lt;/strong&gt; seguido do método e de sua implementação, se quisermos implementar essa &lt;strong&gt;Interface&lt;/strong&gt; na classe &lt;strong&gt;Banco&lt;/strong&gt; não será mais obrigatório fornecer uma implementação para esse método:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Financiamento&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Pagamento&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Auditoria&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//TODO RESTO OMITIDO&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não foi obrigatório fornecer uma implementação porém se for necessário podemos sobrescrever o método &lt;em&gt;audita&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;audita&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Auditoria&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;audita&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AUDITORIA CUSTOMIZADA"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sobrescrevemos o método &lt;em&gt;audita&lt;/em&gt; porém é possível manter a implementação padrão através da chamada &lt;strong&gt;Auditoria.super.audita()&lt;/strong&gt; onde o &lt;strong&gt;super&lt;/strong&gt; serve para invocar o método que está na &lt;strong&gt;Interface&lt;/strong&gt;. Se executarmos esse código agora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;contaJuridicaGuilherme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaJuridica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Empresa do Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="n"&gt;banco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MeuBano"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contaFisicaGuilherme&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;banco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;audita&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;REALIZANDO AUDITORIA
AUDITORIA CUSTOMIZADA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O último ponto entre &lt;strong&gt;Interfaces&lt;/strong&gt; e &lt;strong&gt;Classes Abstratas&lt;/strong&gt; é que não podemos adicionar atributos em &lt;strong&gt;Interfaces&lt;/strong&gt; mas conseguimos fazer isso em &lt;strong&gt;Classes Abstratas&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problema Diamante
&lt;/h2&gt;

&lt;p&gt;No último artigo falamos que não existe &lt;strong&gt;Herança&lt;/strong&gt; múltipla no &lt;strong&gt;Java&lt;/strong&gt; pois se houverem dois métodos com a mesma assinatura em classes diferentes qual método seria executado. Porém o mesmo problema pode ocorrer com &lt;strong&gt;Interfaces&lt;/strong&gt; e é permitido implementar múltiplas &lt;strong&gt;Interfaces&lt;/strong&gt; , como esse problema é contornado nesses casos?&lt;/p&gt;

&lt;p&gt;Vamos criar duas &lt;strong&gt;Interfaces&lt;/strong&gt; , &lt;strong&gt;Log&lt;/strong&gt; e &lt;strong&gt;Logger&lt;/strong&gt; e as duas irão conter um método chamado &lt;em&gt;log&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Log&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"REALIZANDO LOG"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"REALIZANDO LOGGER"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;};&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As duas &lt;strong&gt;Interfaces&lt;/strong&gt; possuem a mesma assinatura e as duas possuem métodos já implementados, se adicionarmos essas &lt;strong&gt;Interfaces&lt;/strong&gt; na classe &lt;strong&gt;Banco&lt;/strong&gt; o código irá parar de compilar. Isso ocorre pois o compilador consegue identificar esse problema e irá nos obrigar a fornecer uma implementação para esse método.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Banco&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acabamos por usar as duas implementações porém poderíamos escolher entre uma delas ou até mesmo criar uma implementação customizada na classe &lt;strong&gt;Banco&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para saber mais sobre o &lt;a href="https://en.wikipedia.org/wiki/Multiple_inheritance" rel="noopener noreferrer"&gt;Problema Diamante&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar Interface ou Classe Abstrata?
&lt;/h2&gt;

&lt;p&gt;Não existe uma resposta padrão para essa pergunta porém podemos analisar qual usar de acordo com alguns critérios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;|---------------------------------------|---------------------------------------------------------|
| Interface                             | Classe Abstrata         
|---------------------------------------|---------------------------------------------------------|
| Várias implementações que compartilham| Compartilhar código em classes relacionadas que possuem | 
| a mesma assinatura de método          | um comportamento em comum 
|---------------------------------------|---------------------------------------------------------|
| Adicionar comportamento mesmo sem     | Compartilhar atributos entre classes 
| ter total certeza de como será        | 
| a implementação 
|---------------------------------------|---------------------------------------------------------|
| Fazer uso de múltiplas implementações | Controle de acesso através de modificadores de acessos  |
|---------------------------------------|---------------------------------------------------------|
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Utilização de Polimorfismo pela linguagem
&lt;/h2&gt;

&lt;p&gt;A própria linguagem &lt;strong&gt;Java&lt;/strong&gt; faz muito uso de &lt;strong&gt;Polimorfismo&lt;/strong&gt; por padrão, um exemplo disso é a &lt;strong&gt;Interface&lt;/strong&gt;  &lt;strong&gt;List&lt;/strong&gt; que possui diversas implementações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stack&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que a variável &lt;strong&gt;lista&lt;/strong&gt; pode carregar várias implementações pois todas essas classes implementam direta ou indiretamente a &lt;strong&gt;Interface&lt;/strong&gt;  &lt;strong&gt;List&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Neste artigo exploramos &lt;strong&gt;Interfaces&lt;/strong&gt; e como podemos fazer uso delas para criar código &lt;strong&gt;Polimórficos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O código deste artigo se encontra no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Primeiros passos com Java VII - Herança e Abstração</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Tue, 09 Nov 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-vii-459a</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-vii-459a</guid>
      <description>&lt;p&gt;No último &lt;a href="https://dev.to/guilhermegarcia86/primeiros-passos-com-java-vi-3dag-temp-slug-4027295"&gt;artigo&lt;/a&gt; iniciamos o assunto sobre &lt;strong&gt;Herança&lt;/strong&gt; e neste artigo será concluído o tema e apresentado o assunto de abstração. Você verá formas de usar esses conceitos para construção de códigos mais consistentes e legíveis.&lt;/p&gt;

&lt;p&gt;No projeto que foi apresentado existe a seguinte situação, em um sistema bancário podemos ter dois tipos de conta, a conta para pessoa física e a conta para pessoa jurídica, para isso foi criado uma classe chamada &lt;strong&gt;Conta&lt;/strong&gt; que serve de molde para as classes &lt;strong&gt;PessoaFisica&lt;/strong&gt; e &lt;strong&gt;PessoaJuridica&lt;/strong&gt; e fazendo uso de &lt;strong&gt;Herança&lt;/strong&gt; isso é possível, porém no decorrer percebemos que era possível criar uma instância da classe &lt;strong&gt;Conta&lt;/strong&gt; e para a regra dessa aplicação isso não deveria ser possível, mas como podemos fazer uso de &lt;strong&gt;Herança&lt;/strong&gt; sem que aja uma breja que pode ser usada de forma equivocada? Iremos ver nesse artigo como podemos fazer uso de &lt;strong&gt;Abstração&lt;/strong&gt; para suprir isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes Abstratas
&lt;/h2&gt;

&lt;p&gt;No nosso exemplo de código seria muito útil se houvesse uma forma de ter uma estrutura de dados que guardasse os atributos e métodos em comum de uma &lt;strong&gt;Conta&lt;/strong&gt; mas que não pudesse ser instanciada e que permitisse o uso de &lt;strong&gt;Herança&lt;/strong&gt;. Essa estrutura existe e é chamada de &lt;strong&gt;Classe Abstrata&lt;/strong&gt; , vamos ver como criar e depois entenderemos melhor os seus benefícios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;deposita&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"EXECUTA REGRA DE NEGÓCIO GENERALISTA"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZERO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;saca&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"EXECUTA REGRA DE NEGÓCIO GENERALISTA"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZERO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//Todo o resto omitido&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reaproveitamos a classe &lt;strong&gt;Conta&lt;/strong&gt; e adicionamos o modificador de acesso &lt;strong&gt;abstract&lt;/strong&gt; , isso já serve em partes pois se tentarmos instanciar uma classe &lt;strong&gt;Conta&lt;/strong&gt; não será mais possível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso gera erro de compilação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s1"&gt;'Conta'&lt;/span&gt; is abstract&lt;span class="p"&gt;;&lt;/span&gt; cannot be instantiated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos entender um pouco mais o que é uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt;. Uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; é uma classe que não pode ser instanciada somente herdada, ela também tem a capacidade de definir métodos sem implementação, chamado de &lt;strong&gt;métodos abstratos&lt;/strong&gt; que são métodos que contém somente a assinatura e que a classe que herdar da &lt;strong&gt;Classe Abstrata&lt;/strong&gt; deve se preocupar com a sua implementação, porém também é possível ter métodos implementados em uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; e através de &lt;strong&gt;sobrescrita de métodos&lt;/strong&gt; customizá-los nas classes que herdarem a &lt;strong&gt;Classe Abstrata&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;OBS: Porém qual estratégia é melhor usar? Deixar métodos implementados nas classes abstratas que podem ser sobrescritos ou deixá-los para serem implementados nas classes filhas? Essa pergunta não é tão simples de responder e cabe a você como desenvolvedor pensar no que faz sentido para cada caso.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para deixar mais claro vamos ver como ficou o código na classe &lt;strong&gt;Conta&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;deposita&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;saca&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"EXECUTA REGRA DE NEGÓCIO GENERALISTA"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZERO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;//Restante omitido&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tem alguns pontos significativos que foram alterados porém agora vamos focar na alteração do método &lt;strong&gt;deposita&lt;/strong&gt; onde foi adicionado o modificador &lt;strong&gt;abstract&lt;/strong&gt; e removido a implementação do método. Isso significa que esse método deve ter obrigatoriamente uma implementação válida na classe que herdar da classe &lt;strong&gt;Conta&lt;/strong&gt; , essa é uma forma de garantirmos que iremos ter um método customizado sendo implementado na classe que for filha da classe &lt;strong&gt;Conta&lt;/strong&gt; , se tentarmos herdar uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; com um &lt;strong&gt;método abstrato&lt;/strong&gt; e não implementarmos nada para esse método iremos receber um erro de compilação.&lt;/p&gt;

&lt;p&gt;Outro ponto que vimos no código acima é a utilização de atributos com o modificador &lt;strong&gt;protected&lt;/strong&gt; , poderíamos ter atributos &lt;strong&gt;private&lt;/strong&gt; ou até mesmo &lt;strong&gt;public&lt;/strong&gt; em uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; porém como o conceito de uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; é ser um “molde” que não pode ser instanciado somente herdado faz muito sentido ser usado o modificador &lt;strong&gt;protected&lt;/strong&gt; pois ele irá garantir que esses campos só poderão ser usados em &lt;strong&gt;sub-classes&lt;/strong&gt; por meio de &lt;strong&gt;Herança&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;OBS: Até o Java 7 esse era o único modo de termos métodos concretos e métodos não implementados em um unico arquivo, porém a partir do Java 8 é possível termos métodos implementados em Interfaces porém esse assunto ainda será abordado mais a frente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Então usando essa ideia podemos fazer da seguinte maneira nas sub-classes de &lt;strong&gt;Conta&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Conta&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;TIPO_DE_DOCUMENTO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CPF"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;documento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;TIPO_DE_DOCUMENTO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;saca&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SAQUE PARA PESSOA "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" COM DOCUMENTO "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="nf"&gt;deposita&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DEPOSITANDO PARA PESSOA "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" COM DOCUMENTO "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;documento&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicando as alterações que foram feitas acima:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Foi criado um construtor para receber o nome do titular da conta e atribuído ao atributo &lt;strong&gt;nome&lt;/strong&gt; que está na super-classe &lt;strong&gt;Conta&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;O método &lt;strong&gt;saca&lt;/strong&gt; está sobrescrito na classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; porém como existe uma implementação na super-classe &lt;strong&gt;Conta&lt;/strong&gt; não seria necessário existir aqui, mas podemos fazer uso desse recurso de sobrescrita para customizações.&lt;/li&gt;
&lt;li&gt;O método &lt;strong&gt;deposita&lt;/strong&gt; necessita obrigatoriamente de uma implementação na sub-classe pois foi definido como um &lt;strong&gt;método abstrato&lt;/strong&gt; na super-classe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora executando esse código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Conta&lt;/span&gt; &lt;span class="n"&gt;conta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PessoaFisica&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saca&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;BigDecimal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZERO&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de ver o resultado desse código reflita um pouco sobre o que deveria acontecer nesse caso? Nós criamos uma instância de &lt;strong&gt;PessoaFisica&lt;/strong&gt; porém atribuímos para uma variável do tipo &lt;strong&gt;Conta&lt;/strong&gt; e depois chamamos o método &lt;strong&gt;saca&lt;/strong&gt; ; tanto a classe &lt;strong&gt;Conta&lt;/strong&gt; quanto a classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; possuem implementações desse método, qual será executado então?&lt;/p&gt;

&lt;p&gt;Analisando o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE
SAQUE PARA PESSOA Guilherme COM DOCUMENTO CPF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele executou o que havia dentro da classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; pois por mais que tenhamos atribuído a uma variável do tipo &lt;strong&gt;Conta&lt;/strong&gt; a instância é do tipo &lt;strong&gt;PessoaFisica&lt;/strong&gt; mas por qual razão foi possível atribuir uma instancia de &lt;strong&gt;PessoaFisica&lt;/strong&gt; em uma variavel do tipo &lt;strong&gt;Conta&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Isso acontece graças ao &lt;strong&gt;Polimorfismo&lt;/strong&gt; porém esse assunto será visto no próximo artigo, por enquanto entenda que é possível atribuir uma sub-classe para uma variável do tipo da super-classe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nessa segunda parte do artigo de &lt;strong&gt;Herança&lt;/strong&gt; entendemos um pouco mais sobre como podemos fazer uso de &lt;strong&gt;Abstração&lt;/strong&gt; com &lt;strong&gt;Classes Abstratas&lt;/strong&gt; para poder criar “moldes” de classes que não podem ser criadas sozinhas e que dependem de sub-classes herdadas para serem usadas. No próximo artigo iremos iniciar o assunto de &lt;strong&gt;Polimorfismo&lt;/strong&gt; e &lt;strong&gt;Interfaces&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O código deste artigo se encontra no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Primeiros passos com Java VI - POO Herança parte 1</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Tue, 26 Oct 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-vi-poo-heranca-parte-1-38cc</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-vi-poo-heranca-parte-1-38cc</guid>
      <description>&lt;p&gt;Neste artigo iremos abordar a &lt;strong&gt;Herança&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; , sendo esse um dos pilares para a &lt;strong&gt;Programação Orientada a Objetos&lt;/strong&gt;. Iremos ver como se comportam relacionamentos de herança, o que é e para que serve a &lt;strong&gt;Sobrescrita&lt;/strong&gt; de métodos. Por se tratar de um assunto mais extenso primeiramente será abordado os conceitos sobre herança e sobrescrita de métodos e posteriormente iremos nos aprofundar em conceitos como &lt;strong&gt;Abstração&lt;/strong&gt; e entrar em &lt;strong&gt;Polimorfismo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando se pesquisa sobre esses temas em alguns tutoriais na internet não é incomum encontrar exemplos explicando &lt;strong&gt;Herança&lt;/strong&gt; com classes como &lt;strong&gt;Animal&lt;/strong&gt; e sub-classes como &lt;strong&gt;Humano&lt;/strong&gt; e &lt;strong&gt;Cachorro&lt;/strong&gt;. Entendo que possa ser didático para quem nunca viu esse assunto antes porém nesse artigo tentaremos ir um pouco além e mostrar exemplos um pouco mais próximos da realidade que uma pessoa desenvolvedora irá encontrar no seu dia-a-dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Herança é um mecanismo que permite ao desenvolvedor aplicar abstrações no código criando uma classe-mãe que possuem atributos ou métodos que podem ser reutilizados por sub-classes que fazem sentido terem aqueles comportamentos e até mesmo permitindo customizações nessas sub-classes.&lt;/p&gt;

&lt;p&gt;Para ficar mais claro vamos pensar que trabalhamos em um banco e que nele existe somente dois tipos de conta, uma para pessoas físicas e outra para pessoas jurídicas, podemos criar duas classes nesse caso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class ContaPessoaFisica {

    private String nome;
    private String documento;

    public BigDecimal deposita(BigDecimal quantidade){
        System.out.println("EXECUTA REGRA DE NEGÓCIO ESPECÍFICO PARA CONTA FISICA");
        return BigDecimal.ZERO;
    }

    public BigDecimal saca(BigDecimal quantidade){
        System.out.println("EXECUTA REGRA DE NEGÓCIO ESPECÍFICO PARA CONTA FISICA");
        return BigDecimal.ZERO;
    }
}

public class ContaPessoaJuridica {

    private String nome;
    private String documento;

    public BigDecimal deposita(BigDecimal quantidade){
        System.out.println("EXECUTA REGRA DE NEGÓCIO ESPECÍFICO PARA CONTA JURIDICA");
        return BigDecimal.ZERO;
    }

    public BigDecimal saca(BigDecimal quantidade){
        System.out.println("EXECUTA REGRA DE NEGÓCIO ESPECÍFICO PARA CONTA JURIDICA");
        return BigDecimal.ZERO;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos perceber que essas duas classes são identicas até o momento, com exceção da lógica que cada uma iria realizar. Mas será que é saudável para um projeto de software ter que lidar com duplicações desse jeito? Imaginando um projeto maior isso logo cresce de uma maneira descontrolada o que vai deixar imprevisível o comportamento do sistema em casos de mudanças pois provavelmente se em algum momento for necessário aplicar uma mesma regra de negócio para contas físicas ou juridicas pode ocorrer desse comportamento não se propagar da forma que foi planejada ou mesmo se for criada outra modalidade de conta nesse projeto será necessário duplicar tudo novamente.&lt;/p&gt;

&lt;p&gt;Pensando em resolver essas complicações a &lt;strong&gt;Herança&lt;/strong&gt; foi adotada na linguagem &lt;strong&gt;Java&lt;/strong&gt; onde podemos ter a classe-mãe, nesse caso &lt;strong&gt;Conta&lt;/strong&gt; e suas filhas &lt;strong&gt;PessoaFisica&lt;/strong&gt; e &lt;strong&gt;PessoaJuridica&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Conta {

    private String nome;
    private String documento;

    public BigDecimal deposita(BigDecimal quantidade){
        System.out.println("EXECUTA REGRA DE NEGÓCIO GENERALISTA");
        return BigDecimal.ZERO;
    }

    public BigDecimal saca(BigDecimal quantidade){
        System.out.println("EXECUTA REGRA DE NEGÓCIO GENERALISTA");
        return BigDecimal.ZERO;
    }

}

public class PessoaFisica extends Conta{

    public static final String TIPO_DE_DOCUMENTO = "CPF";
}

public class PessoaJuridica extends Conta{

    public static final String TIPO_DE_DOCUMENTO = "CNPJ";
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que a classe &lt;strong&gt;Conta&lt;/strong&gt; funciona com a responsabilidade de guardar dados e comportamentos que serão comuns entre as contas físicas e juridicas e por sua vez as classes-filhas guardam atributos e métodos que são específicos para elas. Outro ponto importante é que foi usado a palavra reservada &lt;strong&gt;extends&lt;/strong&gt; , essa palavra é o que irá indicar que está sendo feito um relacionamento do tipo &lt;strong&gt;Herança&lt;/strong&gt; , onde após a palavra &lt;strong&gt;extends&lt;/strong&gt; adicionamos a classe que está sendo herdada. Tem alguns pontos de melhoria em toda essa abordagem e até o fim do artigo iremos explorá-los.&lt;/p&gt;

&lt;p&gt;Agora podemos usar tanto uma conta fisica quanto uma jurídica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Main {

    public static void main(String[] args) {

        PessoaFisica contaPessoaFisica = new PessoaFisica();
        contaPessoaFisica.deposita(BigDecimal.valueOf(10));

        PessoaJuridica contaPessoaJuridica = new PessoaJuridica();
        contaPessoaJuridica.saca(BigDecimal.valueOf(10));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas o que irá acontecer se quiséssemos criar uma instância de &lt;strong&gt;Conta&lt;/strong&gt;? Será que nesse modelo ter uma conta que não é nem física e nem jurídica faz sentido?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Conta conta = new Conta();
conta.deposita(BigDecimal.valueOf(10));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Só não é possível como também é possível depositar e sacar de uma classe que idealmente existe como um molde para outros tipos de conta, porém iremos ver como solucionar esse problema; outro problema que pode ter ficado menos evidente é que agora a regra de negócio para contas físicas e jurídicas é a mesma e não era essa a intenção, precisamos de um jeito melhor de lidar com essas situações e o &lt;strong&gt;Java&lt;/strong&gt; fornece as ferramentas para isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Object
&lt;/h2&gt;

&lt;p&gt;Antes mesmo de continuar é bom ter em mente que na linguagem &lt;strong&gt;Java&lt;/strong&gt; tudo, com exceção dos tipos primitivos, tem relação com a classe &lt;strong&gt;Object&lt;/strong&gt;. Então concluímos que tudo no &lt;strong&gt;Java&lt;/strong&gt; herda de &lt;strong&gt;Object&lt;/strong&gt;. Isso significa que no nosso exemplo a classe &lt;strong&gt;Conta&lt;/strong&gt; herda de &lt;strong&gt;Object&lt;/strong&gt; mas como pode isso se a classe &lt;strong&gt;Conta&lt;/strong&gt; não tem uma declaração &lt;strong&gt;extends&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Isso acontece pois a própria linguagem se encarrega disso e nos artigos anteriores já havíamos utilizado métodos da classe &lt;strong&gt;Object&lt;/strong&gt; sem perceber, quando usamos métodos como &lt;em&gt;toString&lt;/em&gt;, &lt;em&gt;equals&lt;/em&gt; ou &lt;em&gt;hashCode&lt;/em&gt; estamos fazendo uso de métodos da classe &lt;strong&gt;Object&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class Conta {

    //RESTANTE DO CÓDIGO OMITIDO

    @Override
    public String toString() {
        return "Conta{" +
                "nome='" + nome + '\'' +
                ", documento='" + documento + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Conta conta = (Conta) o;
        return Objects.equals(nome, conta.nome) &amp;amp;&amp;amp; Objects.equals(documento, conta.documento);
    }

    @Override
    public int hashCode() {
        return Objects.hash(nome, documento);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa foi uma decisão de projeto dos criadores da linguagem, pois eles entenderam que esses métodos são comuns a todas as classes, o método &lt;em&gt;toString&lt;/em&gt; retorna uma &lt;strong&gt;String&lt;/strong&gt; para que nós pessoas possamos entender a representação daquela instância de objeto, o &lt;em&gt;equals&lt;/em&gt; e o &lt;em&gt;hashCode&lt;/em&gt; são muito importantes quando trabalhamos com coleções de dados e iremos ver a importância deles futuramente.&lt;/p&gt;

&lt;p&gt;Uma dúvida que pode ter ficado após ver o código acima, como o &lt;em&gt;toString&lt;/em&gt; da classe &lt;strong&gt;Conta&lt;/strong&gt; sabe que precisa ser formatado dessa forma ou como os métodos &lt;em&gt;equals&lt;/em&gt; e &lt;em&gt;hashCode&lt;/em&gt; sabem que precisam dos atributos &lt;em&gt;nome&lt;/em&gt; e &lt;em&gt;documento&lt;/em&gt; e o que é esse &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;&lt;/em&gt; escrito acima dos métodos? A resposta mais curta é que esses métodos não sabem e cabe a você dizer isso a eles.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;&lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;&lt;/em&gt; é uma &lt;strong&gt;Annotation&lt;/strong&gt; do &lt;strong&gt;Java&lt;/strong&gt; , não vamos entrar em detalhes agora mas basta entender que &lt;strong&gt;Annotations&lt;/strong&gt; como essa indicam alguma coisa no código, nesse caso ela indica que esse método foi sobrescrito, criando assim um marcador sobre esse método, as &lt;strong&gt;Annotations&lt;/strong&gt; também lidam com outras questões que serão abordadas mais pra frente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobrescrita
&lt;/h2&gt;

&lt;p&gt;Voltando ao problema do nosso projeto, agora a regra de negócio está compartilhada entre as contas e não é isso que queríamos. Como podemos manter a classe &lt;strong&gt;Conta&lt;/strong&gt; com o que queremos mas sem propagar comportamentos que queremos que sejam próprios das classes filhas? Usando sobrescrita de métodos isso é possível, mas o que é sobrescrita de métodos?&lt;/p&gt;

&lt;p&gt;Voltando ao exemplo do método &lt;em&gt;toString&lt;/em&gt; da classe &lt;strong&gt;Object&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public String toString(){
    return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na classe &lt;strong&gt;Object&lt;/strong&gt; essa é a declaração do método &lt;em&gt;toString&lt;/em&gt;, o nome da classe seguido do hexadecimal da classe indicando o endereço de memória do objeto que chamou o método, agora imagine se em todo objeto que chamássemos o &lt;em&gt;toString&lt;/em&gt; fosse essa informação que fosse devolvida, será que seria útil para nós saber onde na memória o objeto está alocado? Pensando nisso existe a sobrescrita de métodos que permite customizações específicas para métodos que são herdados, logo com isso foi possível customizar o &lt;em&gt;toString&lt;/em&gt; da classe &lt;strong&gt;Conta&lt;/strong&gt; para que ele devolvesse uma &lt;strong&gt;String&lt;/strong&gt; que seres humanos consigam ler e entender o seu significado.&lt;/p&gt;

&lt;p&gt;E como as classes &lt;strong&gt;PessoaFisica&lt;/strong&gt; e &lt;strong&gt;PessoaJuridica&lt;/strong&gt; herdam de &lt;strong&gt;Conta&lt;/strong&gt; é possível customizar os métodos para a realidade de negócio delas, primeiramente mostrando a classe &lt;strong&gt;PessoaJuridica&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class PessoaJuridica extends Conta{

    public static final String TIPO_DE_DOCUMENTO = "CNPJ";

    @Override
    public BigDecimal saca(BigDecimal quantidade) {
        System.out.println("VALIDANDO...");
        if(quantidade.compareTo(BigDecimal.ZERO) &amp;lt;= 0){
            System.out.println("VALIDAÇÃO RETORNA ERRO");
            throw new IllegalArgumentException("VALOR DEVE SER MAIOR DO QUE ZERO");
        }
        return super.saca(quantidade);
    }

    @Override
    public BigDecimal deposita(BigDecimal quantidade) {
        System.out.println("VALIDANDO...");
        if(quantidade.compareTo(BigDecimal.ZERO) &amp;lt;= 0){
            System.out.println("VALIDAÇÃO RETORNA ERRO");
            throw new IllegalArgumentException("VALOR DEVE SER MAIOR DO QUE ZERO");
        }
        return super.deposita(quantidade);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na classe &lt;strong&gt;PessoaJuridica&lt;/strong&gt; sobrescrevemos os métodos &lt;em&gt;saca&lt;/em&gt; e &lt;em&gt;deposita&lt;/em&gt; e com isso ganhamos mais flexibilidade pois agora podemos executar uma validação, que poderia estar na super classe &lt;strong&gt;Conta&lt;/strong&gt; mas para fins didáticos vou deixar aqui para ficar claro que podemos executar regras diferentes em métodos sobrescritos, perceba também que apesar dos métodos estarem sobrescritos no final de cada um deles é feito uma chamada &lt;strong&gt;super.saca(quantidade)&lt;/strong&gt; e &lt;strong&gt;super.deposita(quantidade)&lt;/strong&gt; esse exemplo foi deixado aí para que você entenda que é possível executar um método na sub-classe e delegar para a super classe o restante da execução, basta usar o operador &lt;strong&gt;super&lt;/strong&gt; que delega para a super classe a chamada do método. Contudo podemos querer, por vários motivos, que a execução do método sobrescrito fique contido somente na classe específica e para isso podemos fazer do jeito como foi feito na classe &lt;strong&gt;PessoaFisica&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class PessoaFisica extends Conta{

    public static final String TIPO_DE_DOCUMENTO = "CPF";

    @Override
    public BigDecimal saca(BigDecimal quantidade) {
        System.out.println("APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE");
        return quantidade;
    }

    @Override
    public BigDecimal deposita(BigDecimal quantidade) {
        System.out.println("APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE");
        return quantidade;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bastou retirar o operador &lt;strong&gt;super&lt;/strong&gt; para que o método fosse isolado dentro da classe, agora executando o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PessoaFisica contaPessoaFisica = new PessoaFisica();
contaPessoaFisica.deposita(BigDecimal.valueOf(10));

PessoaJuridica contaPessoaJuridica = new PessoaJuridica();
contaPessoaJuridica.saca(BigDecimal.valueOf(10));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Teremos a seguinte saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE
VALIDANDO...
EXECUTA REGRA DE NEGÓCIO GENERALISTA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora resolvemos o problema de ter regras distribuídas para classes que não fazem sentido ter aquela regra, porém ainda temos o problema de poder criar uma classe &lt;strong&gt;Conta&lt;/strong&gt; e iremos ver agora como solucionar isso com &lt;strong&gt;Classes Abstratas&lt;/strong&gt; no próximo artigo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitações
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Herança&lt;/strong&gt; é uma grande ferramenta que auxilia o desenvolvimento de sistemas porém existem algumas limitações e a mais importante no que tange a linguagem &lt;strong&gt;Java&lt;/strong&gt; é que só podemos fazer herança de uma única classe pois no &lt;strong&gt;Java&lt;/strong&gt; não existe herança múltipla. Por exemplo vamos supor que no futuro exista um tipo bem especial de &lt;strong&gt;Conta&lt;/strong&gt; onde ela é ao mesmo tempo uma conta de pessoa física e uma conta de pessoa jurídica, eu sei que pode ser estranho isso mas estamos só supondo para explicar o conceito. Agora imagine que você como pessoa desenvolvedora queira utilizar de &lt;strong&gt;Herança&lt;/strong&gt; para resolver esse problema e pensou que poderia criar um classe &lt;strong&gt;ContaHibrida&lt;/strong&gt; que herde de &lt;strong&gt;PessoaFisica&lt;/strong&gt; e de &lt;strong&gt;PessoaJuridica&lt;/strong&gt; ao mesmo tempo e resolveu fazer isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class ContaHibrida extends ContaPessoaFisica, ContaPessoaJuridica{
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse momento o compilador irá reclamar e exibir uma mensagem parecida com isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Class cannot extend multiple classes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos ir um passo além na nossa imaginação e pensar que isso não gerasse erro e deu tudo certo na sua classe &lt;strong&gt;ContaHibrida&lt;/strong&gt; e você tentou usá-la assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ContaHibrida contaHibrida = new ContaHibrida();
contaHibrida.saca(BigDecimal.valueOf(10));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Qual método &lt;em&gt;saca&lt;/em&gt; será executado? O da &lt;strong&gt;PessoaFisica&lt;/strong&gt; ou o da &lt;strong&gt;PessoaJuridica&lt;/strong&gt;? Esse problema é chamado de problema diamante onde teríamos duas classes com o mesmo método, com a mesma assinatura, parâmetros e com uma sub-classe tentando executá-lo, o compilador não tem condições de saber qual executar e por conta disso a herança múltipla não foi adotada na linguagem &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Essa é a primeira parte que falamos sobre &lt;strong&gt;Herança&lt;/strong&gt; , nesse artigo foi mostrado o que é &lt;strong&gt;Herança&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; e qual tipo de problema ela resolve. Também entendemos mais como a &lt;strong&gt;sobrescrita de métodos&lt;/strong&gt; nos auxilia com classes que herdam métodos que precisam ser customizados. Foi mostrado também uma limitação da &lt;strong&gt;Herança&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; que é a questão de heranças múltiplas. No próximo artigo iremos adentrar um pouco mais no conceito &lt;strong&gt;É-UM&lt;/strong&gt; da &lt;strong&gt;Herança&lt;/strong&gt; e serão apresentados as &lt;strong&gt;Classes Abstratas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O código deste artigo se encontra no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Primeiros passos com Java V - Sobrecarga, Wrappers e Autoboxing</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Wed, 13 Oct 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-v-5i1</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-v-5i1</guid>
      <description>&lt;p&gt;Para este artigo será mostrado como podemos ter maior flexibilidade através da &lt;strong&gt;Sobrecarga&lt;/strong&gt; de métodos. Também será apresentado as &lt;strong&gt;Classes Wrappers&lt;/strong&gt; e o &lt;strong&gt;Autoboxing&lt;/strong&gt; do &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobrecarga
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;sobrecarga&lt;/strong&gt; de métodos permite a pessoa que estiver desenvolvendo ter maior flexibilidade sobre um determinado método, onde pode haver vários métodos com o mesmo nome porém com parâmetros diferentes, para exemplificar vamos imaginar que você está desenvolvendo um jogo onde o personagem pode correr com algum veículo ou a pé, para esse caso pode haver várias abordagens mas para explicar &lt;strong&gt;sobrecarga&lt;/strong&gt; de métodos iremos criar classes para cada tipo de veículo, então teremos as classes &lt;strong&gt;Carro&lt;/strong&gt; , &lt;strong&gt;Moto&lt;/strong&gt; e &lt;strong&gt;Bicicleta&lt;/strong&gt; e também iremos criar a classe &lt;strong&gt;Personagem&lt;/strong&gt; que irá conter a ação de acelerar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;    

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse é o exemplo da classe &lt;strong&gt;Carro&lt;/strong&gt; , onde ela só possui o &lt;strong&gt;atributo&lt;/strong&gt; nome, o construtor recebendo o nome e os métodos &lt;em&gt;getter/setters&lt;/em&gt;, as outras classes &lt;strong&gt;Moto&lt;/strong&gt; e &lt;strong&gt;Bicicleta&lt;/strong&gt; seguem o mesmo padrão, e agora vamos ver a classe &lt;strong&gt;Personagem&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Personagem&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classe &lt;strong&gt;Personagem&lt;/strong&gt; possui, por enquanto, apenas o atributo nome e agora vamos implementar o método &lt;em&gt;acelera&lt;/em&gt; que irá retornar uma &lt;strong&gt;String&lt;/strong&gt; com a informação que o &lt;strong&gt;Personagem&lt;/strong&gt; está acelerando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;em&gt;acelera&lt;/em&gt; informa que o &lt;strong&gt;Personagem&lt;/strong&gt; está acelerando mas não diz se é a pé ou com algum veículo. Poderíamos fazer da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;aceleraDeBicicleta&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando com bicicleta"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;aceleraComMoto&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando com moto"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;aceleraComCarro&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando com carro"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando a pé"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas com a &lt;strong&gt;sobrecarga&lt;/strong&gt; podemos criar métodos mais específicos mantendo o mesmo nome, contanto que o parâmetro de entrada seja diferente no método, então podemos fazer da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Bicicleta&lt;/span&gt; &lt;span class="n"&gt;bicicleta&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando com a bicicleta: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;bicicleta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Moto&lt;/span&gt; &lt;span class="n"&gt;moto&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando com a moto: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;moto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando com o carro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando a pé"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foram criados mais três métodos com o mesmo nome porém com entradas diferentes, cada um recebendo um tipo diferente de veículo e o primeiro método foi melhorado para retornar um texto mais compreensível. Você pode ter notado que para a &lt;strong&gt;sobrecarga&lt;/strong&gt; ocorrer não foi necessário alterar o tipo do retorno mas isso também pode ser feito porém para que isso funcione não pode haver ambiguidade para o compilador, pois pense o que iria acontecer se criássemos um método que recebe os mesmos parâmetros mas tem um retorno diferente?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando a pé"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui temos dois métodos &lt;em&gt;acelera&lt;/em&gt; porém com retornos diferentes e se fossemos usar &lt;strong&gt;personagem.acelera();&lt;/strong&gt; qual dos dois deveria ser executado? O compilador não tem como identificar isso e por isso esse código não compila. Agora se alterarmos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Acelerando a pé"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;kmH&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;kmH&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pensando em um método &lt;em&gt;acelera&lt;/em&gt; que recebe a quantidade quilometros por hora que deve ser acelerado; esse código compila pois o compilador já sabe diferenciar pelo parâmetro o que cada método recebe.&lt;/p&gt;

&lt;p&gt;Agora exemplificando como usar o código que foi criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;ferrari&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ferrari"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Moto&lt;/span&gt; &lt;span class="n"&gt;harley&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Moto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Harley"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Bicicleta&lt;/span&gt; &lt;span class="n"&gt;caloi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Bicicleta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Caloi"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Personagem&lt;/span&gt; &lt;span class="n"&gt;heroi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Personagem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Heroi"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heroi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heroi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heroi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;harley&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heroi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ferrari&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heroi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelera&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;caloi&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E a saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Acelerando a pé
10
Acelerando com o moto: Harley
Acelerando com o carro: Ferrari
Acelerando com o bicicleta: Caloi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Classe Wrapper
&lt;/h2&gt;

&lt;p&gt;As classes &lt;strong&gt;Wrappers&lt;/strong&gt; são classes que foram criadas na linguagem &lt;strong&gt;Java&lt;/strong&gt; para representar um tipo primitivo, elas são classes empacotadoras desses tipos primitivos. Quando em um programa usamos um tipo primitivo, por exemplo um &lt;strong&gt;int&lt;/strong&gt; por padrão ele recebe um valor padrão caso nenhum valor seja passado diretamente para ele, no caso de &lt;strong&gt;int&lt;/strong&gt; o valor é 0. Isso é um detalhe do &lt;strong&gt;Java&lt;/strong&gt; , quer seja tipo primitivo ou não tudo recebe um valor padrão, nos casos de classes o valor padrão é &lt;strong&gt;null&lt;/strong&gt; , que significa ausência de valor.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo será mostrado a diferença entre o tipo primitivo &lt;strong&gt;int&lt;/strong&gt; e a classe &lt;strong&gt;Integer&lt;/strong&gt; que empacota o tipo &lt;strong&gt;int&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Wrapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;numeroWrapper&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Wrapper&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Wrapper&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumero&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumeroWrapper&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando esse código teremos a seguinte saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0
null
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Preste atenção que ao executar o programa é exibido o valor &lt;strong&gt;0&lt;/strong&gt; para a variável com nome &lt;strong&gt;numero&lt;/strong&gt; que é um tipo primitivo &lt;strong&gt;int&lt;/strong&gt; e para a variável &lt;strong&gt;numeroWrapper&lt;/strong&gt; o valor exibido é &lt;strong&gt;null&lt;/strong&gt; significando que não existe um valor definido para essa variável.&lt;/p&gt;

&lt;p&gt;Pensando nisso foram criadas as classes &lt;strong&gt;Wrappers&lt;/strong&gt; que representam os tipos primitivos, com isso é possível ter uma classe que representa um valor primitivo, como ocorre com &lt;strong&gt;int&lt;/strong&gt; , porém sem ter um valor padrão definido a ele. Fora que por ser uma classe existem vários métodos que podem ser utilizados e que auxiliam a pessoa que estiver desenvolvendo porém não são muito usados no dia-a-dia a vantagem que particularmente eu vejo é a capacidade que uma classe &lt;strong&gt;Wrapper&lt;/strong&gt; tem de não possuir um valor o que também pode ser perigoso pois se tentarmos usar um atributo que for &lt;strong&gt;null&lt;/strong&gt; será lançado uma &lt;strong&gt;Exception&lt;/strong&gt; do tipo &lt;strong&gt;NullPointerException&lt;/strong&gt; então lembre-se de sempre atribuir um valor quando estiver usando uma classe &lt;strong&gt;Wrapper&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autoboxing
&lt;/h2&gt;

&lt;p&gt;Classes &lt;strong&gt;Wrappers&lt;/strong&gt; possuem alguns métodos, como foi citado anteriormente, entre esses métodos existe o &lt;strong&gt;valueOf&lt;/strong&gt; que faz conversão de um valor primitivo para a uma classe &lt;strong&gt;Wrapper&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;booleanWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valueOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o oposto também pode ocorrer com o método &lt;em&gt;booleanValue&lt;/em&gt;, no caso da classe &lt;strong&gt;Wrapper Boolean&lt;/strong&gt; mas para cada &lt;strong&gt;Wrapper&lt;/strong&gt; existe o seu método equivalente para conversão de um objeto para o seu tipo primitivo correspondente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;booleanWrapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;booleanValue&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém no &lt;strong&gt;Java&lt;/strong&gt; existe o que é chamado &lt;strong&gt;Autoboxing&lt;/strong&gt; e &lt;strong&gt;Unboxing&lt;/strong&gt; que é a capacidade da própria linguagem realizar essas conversões para nós:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;falso&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FALSE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;verdadeiro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Nesse artigo entendemos um pouco melhor a &lt;strong&gt;Sobrescrita&lt;/strong&gt; de métodos e como ela pode fornecer maior flexibilidade na hora do desenvolvimento, também vimos as &lt;strong&gt;Classes Wrappers&lt;/strong&gt; e o recurso de &lt;strong&gt;Autoboxing&lt;/strong&gt; e &lt;strong&gt;Unboxing&lt;/strong&gt; da linguagem &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O código deste artigo se encontra no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Primeiros passos com Java IV - POO Classes e Encapsulamento</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Mon, 04 Oct 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-iv-nb4</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-iv-nb4</guid>
      <description>&lt;p&gt;Nesse artigo chegamos a &lt;strong&gt;Orientação a Objetos&lt;/strong&gt; , no últimos artigos foi mostrado a parte básica da linguagem e de sua sintaxe e agora será mostrado &lt;strong&gt;Classes&lt;/strong&gt; , que sem isso não haveria &lt;strong&gt;Orientação a Objetos&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; , também será mostrado &lt;strong&gt;Encapsulamento&lt;/strong&gt; e como ele é importante na linguagem.&lt;/p&gt;

&lt;h1&gt;
  
  
  Orientação a Objetos
&lt;/h1&gt;

&lt;p&gt;Antes de iniciarmos qualquer explicação sobre &lt;strong&gt;Classes&lt;/strong&gt; é necessário entender o que é &lt;strong&gt;Orientação a Objetos&lt;/strong&gt; e como esse paradigma é tratado no &lt;strong&gt;Java&lt;/strong&gt;. Antes de existir a &lt;strong&gt;Orientação a Objetos&lt;/strong&gt; o paradigma que dominava o mercado era o paradigma procedural, e resumidamente esse paradigma é sobre escrever métodos ou &lt;strong&gt;procedimentos&lt;/strong&gt; que deveriam ser executados no código enquanto que &lt;strong&gt;Orientação a Objetos&lt;/strong&gt; consiste em criação de &lt;strong&gt;Objetos&lt;/strong&gt; que contém tanto &lt;strong&gt;métodos&lt;/strong&gt; quanto &lt;strong&gt;atributos&lt;/strong&gt; , que são dados referentes aquele &lt;strong&gt;Objeto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O paradigma orientado a objetos trás consigo quatro fundamentos básicos que o torna diferente do paradigma procedural:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abstração&lt;/li&gt;
&lt;li&gt;Encapsulamento&lt;/li&gt;
&lt;li&gt;Herança&lt;/li&gt;
&lt;li&gt;Polimorfismo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Iremos tratar de cada um desses temas nos próximos artigos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classe
&lt;/h2&gt;

&lt;p&gt;Para entender um &lt;strong&gt;Objeto&lt;/strong&gt; é mais fácil explicar o que é uma &lt;strong&gt;Classe&lt;/strong&gt; já que a classe seria o “molde” para um objeto. Para entender melhor vamos pensar em um sistema de Recursos Humanos onde temos o cadastro de &lt;strong&gt;Funcionários&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daqui a pouco será explicado o que são as palavras &lt;strong&gt;public&lt;/strong&gt; e &lt;strong&gt;private&lt;/strong&gt; mas por enquanto iremos focar na declaração da &lt;strong&gt;classe&lt;/strong&gt; e seus &lt;strong&gt;atributos&lt;/strong&gt;. No código acima foi criada a &lt;strong&gt;classe&lt;/strong&gt; Funcionário e não um &lt;strong&gt;objeto&lt;/strong&gt; Funcionario mas o que isso significa? Significa que foi criado um “molde” ou um “esqueleto” do que é um funcionário para o nosso código, foi definido que todo &lt;strong&gt;Funcionário&lt;/strong&gt; possui um &lt;strong&gt;nome&lt;/strong&gt; e &lt;strong&gt;sobrenome&lt;/strong&gt; , uma &lt;strong&gt;idade&lt;/strong&gt; , um &lt;strong&gt;endereço&lt;/strong&gt; e um &lt;strong&gt;departamento&lt;/strong&gt; mas ainda não foi criado nenhum funcionário no sistema.&lt;/p&gt;

&lt;p&gt;Antes de ver como criar um &lt;strong&gt;objeto&lt;/strong&gt; do tipo &lt;strong&gt;Funcionário&lt;/strong&gt; veremos a sintaxe de uma classe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NomeDaClasse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa é sintaxe mais básica para existir uma classe, é necessária a palavra reservada &lt;strong&gt;class&lt;/strong&gt; , no nome seguimos o padrão &lt;strong&gt;camel case&lt;/strong&gt; seguido de chaves &lt;strong&gt;{}&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Os dados da &lt;strong&gt;classe Funcionário&lt;/strong&gt; são chamados de &lt;strong&gt;atributos&lt;/strong&gt; e possuem e sintaxe básica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É necessário informar qual é o tipo que representa esse &lt;strong&gt;atributo&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; então temos o primeiro &lt;strong&gt;atributo&lt;/strong&gt; (nome) do tipo &lt;strong&gt;String&lt;/strong&gt; (texto), idade do tipo &lt;strong&gt;int&lt;/strong&gt; , numérico e etc. A palavra reservada &lt;strong&gt;private&lt;/strong&gt; não é obrigatória porém será entendida mais adiante nesse artigo quando for explicado sobre &lt;strong&gt;Encapsulamento&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para criar um &lt;strong&gt;Objeto&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; é usado a palavra reservada &lt;strong&gt;new&lt;/strong&gt; , que irá criar um &lt;strong&gt;Objeto&lt;/strong&gt; na memória e será possível manipular dados desse objeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, só com isso já temos em mãos um objeto do tipo &lt;strong&gt;Funcionario&lt;/strong&gt; , também é possível fazer dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como foi dito em artigos anteriores o &lt;strong&gt;Java&lt;/strong&gt; agora é capaz de realizar inferência de tipos, que é capacidade de “saber” qual é o tipo de uma variável mesmo sem declarar explicitamente o seu tipo, como no caso do código acima onde foi criado um objeto do tipo Funcionário e passado para a variável &lt;strong&gt;var funcionario&lt;/strong&gt; sem dizer qual é o seu tipo, o compilador consegue entender que aquela variável é do tipo Funcionario.&lt;/p&gt;

&lt;p&gt;Um ponto importante é que foi necessário colocar parenteses &lt;strong&gt;()&lt;/strong&gt; após a palavra &lt;strong&gt;new&lt;/strong&gt; , isso acontece pois &lt;strong&gt;Funcionario()&lt;/strong&gt; é um método. Um método especial do &lt;strong&gt;Java&lt;/strong&gt; que se chama &lt;strong&gt;Construtor&lt;/strong&gt; e ele é responsável pela inicialização dos &lt;strong&gt;objetos&lt;/strong&gt; , por padrão toda &lt;strong&gt;classe&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; possui um método construtor sem argumentos então seria como se a &lt;strong&gt;classe Funcionario&lt;/strong&gt; fosse assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(){}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método construtor é um método que tem o mesmo nome da &lt;strong&gt;classe&lt;/strong&gt; e não possui um retorno em sua assinatura e com ele conseguimos criar os objetos.&lt;/p&gt;

&lt;p&gt;Agora já sabemos como criar objetos, mas o objeto &lt;strong&gt;Funcionario&lt;/strong&gt; possui atributos que não foram preenchidos, como nome, idade, endereço e departamento. Para lidar com isso é possível criar um método &lt;strong&gt;construtor&lt;/strong&gt; onde passamos esses atributos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endereco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;departamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modificamos o método construtor de &lt;strong&gt;Funcionario&lt;/strong&gt; e agora ele recebe todos os dados, porém agora se tentarmos rodar o código como estava antes ele não irá compilar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;company&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;artigoiv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Funcionario&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;applied&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso ocorre pois quando explicitamente escrevemos um método construtor o método construtor padrão deixa de existir se por acaso quiséssemos ter os dois construtores, nós podemos mas é necessário escrever isso no código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endereco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;departamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inclusive podemos ter quantos métodos construtores forem necessários porém não é uma boa prática ter muitos métodos construtores, em casos que seja necessário existem outras abordagens e padrões como o &lt;strong&gt;Builder&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Outro ponto que é bom mostrar é que dentro do construtor criado foi usado a palavra &lt;strong&gt;this&lt;/strong&gt;. Entender isso é de grande importância pois o &lt;strong&gt;this&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; faz referência a própria classe, é ela se auto referenciando e aqui no construtor isso é importante pois as variáveis que são passadas nos argumentos do construtor possuem o mesmo nome das &lt;strong&gt;atributos&lt;/strong&gt; e para saber em qual variável será guardado o valor o &lt;strong&gt;this&lt;/strong&gt; nos auxilia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endereco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;departamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;strong&gt;this.nome&lt;/strong&gt; dentro do construtor significa que ela se refere a variável &lt;strong&gt;nome&lt;/strong&gt; da classe &lt;strong&gt;Funcionario&lt;/strong&gt; e não a variável &lt;strong&gt;nome&lt;/strong&gt; do método construtor, se por acaso você retirar o &lt;strong&gt;this&lt;/strong&gt; a variável &lt;strong&gt;nome&lt;/strong&gt; da classe &lt;strong&gt;Funcionario&lt;/strong&gt; não receberá valor e na verdade você estará reatribuindo o valor da variável &lt;strong&gt;nome&lt;/strong&gt; do método construtor para ela mesma. Então conseguimos ver o significado do &lt;strong&gt;this&lt;/strong&gt; dentro de uma classe, sempre que houver &lt;strong&gt;this&lt;/strong&gt; dentro de uma classe significa que está ocorrendo uma referência para ela mesma.&lt;/p&gt;

&lt;p&gt;Uma classe também pode ter métodos, o que faz muito sentido pois uma classe que somente tenha &lt;strong&gt;atributos&lt;/strong&gt; não teria conseguiria executar muita coisa dentro do seu código ela serviria como uma objeto de transporte de dados talvez, existe um padrão chamado &lt;strong&gt;DTO&lt;/strong&gt; onde as classes executam esse papel de transporte de dados mas podemos fazer mais com as classes quando adicionamos métodos a elas. Na classe &lt;strong&gt;Funcionario&lt;/strong&gt; podemos adicionar um método para exibir o nome completo de um funcionário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;nomeCompleto&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;nomeCompleto&lt;/strong&gt; retorna uma &lt;strong&gt;String&lt;/strong&gt; que é a junção, usamos o termo concatenação nesses casos, do valor da variável &lt;strong&gt;nome&lt;/strong&gt; , uma &lt;strong&gt;String&lt;/strong&gt; vazia para fazer o espaço e o valor da variável &lt;strong&gt;sobrenome&lt;/strong&gt; , se executarmos o programa teremos o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alves"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"São Paulo"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Desenvolvimento"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nomeCompleto&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Guilherme Alves
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então no código acima foi criado um objeto do tipo &lt;strong&gt;Funcionario&lt;/strong&gt; , usando o método construtor para adicionar valores a ele, atribuído esse objeto para a variável &lt;strong&gt;funcionario&lt;/strong&gt; e executado o método &lt;strong&gt;nomeCompleto&lt;/strong&gt;. Dois pontos são importantes de serem analisados no código acima, o primeiro é que para executarmos um método de uma classe ou até mesmo para acessar os atributos de uma classe usamos o &lt;strong&gt;.&lt;/strong&gt; (ponto) que nesse caso serve como operador de acesso aos elementos de uma classe, então nesse caso foi usado o operador &lt;strong&gt;.&lt;/strong&gt; (ponto) para acessar e executar o método &lt;strong&gt;nomeCompleto&lt;/strong&gt; e o segundo ponto que talvez não possa ter ficado claro é que quando criamos um objeto no &lt;strong&gt;Java&lt;/strong&gt; estamos criando algo que é único, por mais que eu possa criar vários objetos do tipo &lt;strong&gt;Funcionario&lt;/strong&gt; com os mesmos valores eles serão objetos diferentes para o &lt;strong&gt;Java&lt;/strong&gt; pois serão criados e alocados em diferentes espaços de memória, para ficar claro vamos criar dois objetos com os mesmos dados e fazer uma comparação entre eles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alves"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"São Paulo"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Desenvolvimento"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionarioII&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alves"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"São Paulo"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Desenvolvimento"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionarioII&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionarioII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos dois objetos do tipo &lt;strong&gt;Funcionario&lt;/strong&gt; e usamos o método &lt;strong&gt;equals&lt;/strong&gt; , logo falaremos sobre ele, para saber se os objetos são iguais, logo após foi executado o método &lt;strong&gt;toString&lt;/strong&gt; , também falaremos sobre ele, para imprimir na tela o valor textual desses objetos, o resultado foi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;false
&lt;/span&gt;br.com.company.artigoiv.Funcionario@27f674d
br.com.company.artigoiv.Funcionario@1d251891
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado foi &lt;strong&gt;false&lt;/strong&gt; para a verificação de igualdade entre os objetos; o resultado irá variar em cada computador pois o método &lt;strong&gt;toString&lt;/strong&gt; do jeito que está agora exibe o nome da classe completo mais o valor hexadecimal que representa o endereço de memória onde está o objeto e podemos entender que apesar de terem os mesmos valores esses objetos estão em endereços de memória diferentes.&lt;/p&gt;

&lt;p&gt;Aproveitando o assunto de classes, no artigo anterior foi comentado sobre o modificador &lt;strong&gt;static&lt;/strong&gt; e que ao usá-lo o atributo ou método passa a pertencer a classe e não mais uma instância, vamos entender um pouco melhor o que isso significa.&lt;/p&gt;

&lt;p&gt;Vamos imaginar que todo funcionário possua um &lt;strong&gt;CPF&lt;/strong&gt; , é só um exemplo hipotético para explicar o conceito de &lt;strong&gt;static&lt;/strong&gt; , então como todo funcionário possui esse atributo poderíamos deixar esse tipo de documento como sendo uma constante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;TIPO_DOCUMENTO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CPF"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E podemos usar essa constante em qualquer lugar sem ter a necessidade de ter uma instância de &lt;strong&gt;Funcionario&lt;/strong&gt; para funcionar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O tipo de documento de todo funcionario é o "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TIPO_DOCUMENTO&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bastando importar essa constante diretamente a partir da classe &lt;strong&gt;Funcionario&lt;/strong&gt; e o mesmo é válido para métodos que também podem ser estáticos, em casos onde algum comportamento independa de um objeto criado, para esse exemplo vamos criar um método estático dessa mensagem que imprimimos na tela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;TIPO_DOCUMENTO&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"CPF"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;imprimeTipoDeDocumentoDosFuncionarios&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"O tipo de documento de todo funcionario é o "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TIPO_DOCUMENTO&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E para usar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;imprimeTipoDeDocumentoDosFuncionarios&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da mesma forma como foi feito com a constante, não é necessário existir uma instância de &lt;strong&gt;Funcionario&lt;/strong&gt; para esse método funcionar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encapsulamento
&lt;/h2&gt;

&lt;p&gt;Após essa introdução às classes, construtores e atributos já é possível entender que uma classe é um container que guarda &lt;strong&gt;atributos&lt;/strong&gt; (dados) sobre um determinado assunto, no nosso exemplo dados de um &lt;strong&gt;Funcionário&lt;/strong&gt; e métodos (ações) que podemos executar a partir de uma instância de um objeto.&lt;/p&gt;

&lt;p&gt;No exemplo anterior foi criado um objeto &lt;strong&gt;Funcionario&lt;/strong&gt; usando o construtor e passando todos os dados de um funcionário, porém nem sempre isso está disponível, pense em um empresa onde na contratação de um funcionário ele pode enviar depois alguns documentos como o comprovante de endereço por exemplo e nesse caso o que poderíamos fazer?&lt;/p&gt;

&lt;p&gt;Podemos criar mais um construtor sem o &lt;strong&gt;atributo&lt;/strong&gt; endereço por exemplo, mas já temos dois construtores criados e o nosso código pode ficar poluído. Existia um padrão que era chamado de &lt;strong&gt;Construtor Telescópio&lt;/strong&gt; que consistia em criar vários construtores começando desde o construtor sem argumentos e aumentando até o construtor com todos os argumentos, no nosso código ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endereco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endereco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endereco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;departamento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A classe &lt;strong&gt;Funcionario&lt;/strong&gt; está ficando cada vez maior e até o momento só temos um método, se essa classe adicionar mais um &lt;strong&gt;atributo&lt;/strong&gt; terá que acrescentar mais um construtor e quando tiver mais métodos a leitura e o entendimento vão ficar muito difíceis por conta de um código que só existe para criar um objeto. Então você pode perceber que esse padrão não é mais usado, mas agora ainda temos que resolver o problema de como criar um objeto &lt;strong&gt;Funcionario&lt;/strong&gt; sem o endereço ou outros dados e depois adicioná-los.&lt;/p&gt;

&lt;p&gt;Podemos criar um objeto &lt;strong&gt;Funcionario&lt;/strong&gt; com o construtor padrão e depois atribuir os valores a ele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionarioIII&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Jose"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Alves"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você tentou fazer isso percebeu que esse código não compila pois o atributo &lt;strong&gt;nome&lt;/strong&gt; e &lt;strong&gt;sobrenome&lt;/strong&gt; não são acessíveis. Mas por que isso acontece? Isso se deve ao fato de que na classe &lt;strong&gt;Funcionario&lt;/strong&gt; os atributos estão com o modificador de acesso &lt;strong&gt;private&lt;/strong&gt; tornando-os inacessíveis para outras classes.&lt;/p&gt;

&lt;p&gt;Isso significa que ler esses atributos agora também se tornou impossível:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código também não compila pelo mesmo motivo. Mas como poderemos trabalhar com os atributos e por que usar o modificador &lt;strong&gt;private&lt;/strong&gt; para deixar os atributos inacessíveis?&lt;/p&gt;

&lt;p&gt;Antes de mais nada vamos pensar que estamos trabalhando em uma grande equipe e que hoje escrevemos esse código e que não foi colocado o modificador &lt;strong&gt;private&lt;/strong&gt; e depois de um tempo outro desenvolvedor sem saber muito bem as regras de um funcionário no sistema de RH modifica o código que atribui o nome a um funcionário e faz algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionarioIII&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código vai continuar compilando e vai executar sem dar algum problema visível porém estará com uma falha pois agora o nome do funcionário é &lt;strong&gt;null&lt;/strong&gt;. Para impedir esse tipo comportamento de acessar diretamente dados de uma classe é que o &lt;strong&gt;encapsulamento&lt;/strong&gt; foi pensado.&lt;/p&gt;

&lt;p&gt;Mas nesses casos como poderá ser resolvido o problema de acesso as variáveis pois é necessário adicionar ou ler valores na classe &lt;strong&gt;Funcionario&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Para esses casos existem dois métodos especiais que nos auxiliam que são os chamados métodos &lt;strong&gt;getters&lt;/strong&gt; e &lt;strong&gt;setters&lt;/strong&gt; , onde o &lt;strong&gt;get&lt;/strong&gt; é usado para leitura de dados e o &lt;strong&gt;set&lt;/strong&gt; para adição de valores, então o código da classe &lt;strong&gt;Funcionario&lt;/strong&gt; ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getSobrenome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setSobrenome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sobrenome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sobrenome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima voltamos o modificador &lt;strong&gt;private&lt;/strong&gt; e foi adicionado os métodos &lt;strong&gt;get&lt;/strong&gt; e &lt;strong&gt;set&lt;/strong&gt; para cada atributo; o método &lt;strong&gt;getNome&lt;/strong&gt; oferece acesso ao valor do atributo &lt;strong&gt;nome&lt;/strong&gt; e método &lt;strong&gt;setNome&lt;/strong&gt; recebe uma &lt;strong&gt;String&lt;/strong&gt; e atribui o seu valor para a variável &lt;strong&gt;nome&lt;/strong&gt; da classe, isso já cria uma camada sobre os atributos mas aparentemente nós só movemos o comportamento de ler/adicionar valores para uma complexidade maior porém existe uma vantagem aqui que nem sempre é compreendida, nós conseguimos através dessa camada bloquear ou validar informações de entrada ou saída como no exemplo a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor do nome não foi preenchido"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isBlank&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor deve ser preenchido"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foi feita uma validação prévia tanto na entrada como na leitura dos dados e para usar essa nova abordagem podemos fazer da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionarioIII&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Guilherme"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;funcionarioIII&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No codigo acima criamos uma instância de &lt;strong&gt;Funcionario&lt;/strong&gt; e atribuímos a variável &lt;strong&gt;funcionarioIII&lt;/strong&gt; , depois usamos o método &lt;strong&gt;setNome&lt;/strong&gt; porém passando &lt;strong&gt;null&lt;/strong&gt; , após isso usamos o método &lt;strong&gt;getNome&lt;/strong&gt; para imprimir na tela o valor que nome possui, e por fim usamos novamente o método &lt;strong&gt;setNome&lt;/strong&gt; porém agora passando um valor real e novamente usamos o &lt;strong&gt;getNome&lt;/strong&gt; para recuperar o seu valor. O resultado é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Valor deve ser preenchido
Valor &lt;span class="k"&gt;do &lt;/span&gt;nome não foi preenchido

Guilherme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então foi possível um certo nível de proteção aos dados da classe &lt;strong&gt;Funcionario&lt;/strong&gt;. Então com &lt;strong&gt;encapsulamento&lt;/strong&gt; podemos ver que temos como proteger e controlar melhor os atributos dentro de uma classe, também existe uma flexibilidade maior caso quiséssemos deixar os valores impedidos de ser escritos, pois poderíamos facilmente retirar os métodos &lt;strong&gt;setters&lt;/strong&gt; e deixar para atribuição de valores apenas no momento da criação da classe através do &lt;strong&gt;construtor&lt;/strong&gt; do objeto e ter os atributos como apenas leitura que é um conceito muito utilizado quando é pensado em objetos imutáveis.&lt;/p&gt;

&lt;p&gt;Existem outros modificadores de acesso que são tanto utilizados para controle de acesso quanto para outros comportamentos e irei citá-los aqui porém serão vistos com mais profundidade em outros assuntos mais pra frente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;public&lt;/strong&gt; : Esse modificador já vimos tanto nas classes, métodos e atributos, quando algo é marcado com esse modificador tem o seu escopo mais abrangente podendo ser usado em todos pacotes ou lugares do código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;protected&lt;/strong&gt; : Com esse modificador o atributo ou método só será visível em suas &lt;strong&gt;subclasses&lt;/strong&gt; , será visto quando for falado sobre &lt;strong&gt;Herança&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;default&lt;/strong&gt; : Quando usado esse modificador o código só é acessível dentro do seu próprio pacote. Para usar esse modificador basta deixar sem nenhuma palavra reservada antes da classe, método ou atributo, se tentar um código &lt;strong&gt;default&lt;/strong&gt; em outro pacote irá ocorrer o mesmo erro de compilação de quando tentamos acessar um atributo &lt;strong&gt;private&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outros modificadores, que alguns já fora abordados, são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;final&lt;/strong&gt; : Quando utilizado em classes significa que esta não pode ser herdada por outras classes; quando usado em métodos ou atributos significa que os mesmos não podem ser sobrescritos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;abstract&lt;/strong&gt; : Quando utilizado em classes significa que esta classe é uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; , um tipo diferente de classe que veremos mais a frente; quando utilizada em métodos dentro de uma &lt;strong&gt;Classe Abstrata&lt;/strong&gt; é para que sua implementação seja realizada na &lt;strong&gt;subclasse&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;static&lt;/strong&gt; : Utilizado em métodos ou atributos que são pertencentes a classe e não a instância.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;transient&lt;/strong&gt; : Utilizado em métodos ou atributos faz com que não sejam serializados. Utilizado em alguns casos no contexto de envio de informações para banco de dados onde alguns atributos não devem ser persistidos, mas não se preocupe com isso agora pois mesmo a sua utilização não é tão frequente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;synchronized&lt;/strong&gt; : Utilizados em métodos quando escrevemos códigos de acesso paralelo, mas novamente não muito utilizado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;Vimos nesse artigo como criar e usar classes, desde a sua sintaxe até como proteger dados com encapsulamento. Vimos que criar métodos &lt;strong&gt;getters/setters&lt;/strong&gt; acaba deixando um voluma alto de código que é usado apenas para cumprir com requisitos da linguagem mas sem lógica para o problema que desejamos resolver, chamados de códigos &lt;strong&gt;boilerplate&lt;/strong&gt; , porém existe hoje muitas ferramentas que auxiliam o desenvolvedor nesse aspecto, as próprias &lt;strong&gt;IDEs&lt;/strong&gt; ajudam muito na geração automática desse código, como é o caso do &lt;strong&gt;IntelliJ&lt;/strong&gt; , &lt;strong&gt;Eclipse&lt;/strong&gt; ou &lt;strong&gt;VSCode&lt;/strong&gt; , porém existem bibliotecas escritas no &lt;strong&gt;Java&lt;/strong&gt; que foram feitas para nos ajudar como é o caso do projeto &lt;a href="https://projectlombok.org/" rel="noopener noreferrer"&gt;Lombok&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O código deste artigo se encontra no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Primeiros passos com Java III - Métodos, escopo e recursão</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Mon, 27 Sep 2021 00:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-iii-metodos-escopo-e-recursao-1b5f</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-iii-metodos-escopo-e-recursao-1b5f</guid>
      <description>&lt;p&gt;Dando continuidade a série de artigos sobre o &lt;strong&gt;Java&lt;/strong&gt; hoje erá abordado &lt;strong&gt;métodos&lt;/strong&gt; , &lt;strong&gt;escopo&lt;/strong&gt; e &lt;strong&gt;recursão&lt;/strong&gt;. Ao fim desse artigo você será capaz de entender esses conceitos e também conseguirá aplicá-los em projetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos
&lt;/h2&gt;

&lt;p&gt;Nos artigos anteriores foi mostrado alguns métodos porém não entramos a fundo sobre o que significava aquilo, porém agora chegou a hora de entendê-los a fundo. Um método é uma ação que é desenvolvida porém só deve ser executada em algum momento programado, um método é um bloco de código que deve ser executado em um momento específico do programa.&lt;/p&gt;

&lt;p&gt;A vantagem de usar métodos é o reaproveitamento de códigos onde podemos escrever uma vez aquele bloco e ele poderá ser executado em outros pontos sem que aja a necessidade de reescrever sempre a mesma funcionalidade.&lt;/p&gt;

&lt;p&gt;No código abaixo será escrito um método simples mas onde poderemos ver a sintaxe de um método no &lt;strong&gt;Java&lt;/strong&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;helloWorld&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Olá Mundo!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método que foi criado irá exibir a mensagem &lt;strong&gt;Olá Mundo!&lt;/strong&gt; , porém o que é necessário prestar atenção é a sintaxe como isso foi feito. Um método pode ter um &lt;strong&gt;modificador de acesso&lt;/strong&gt; que significa basicamente se esse método pode ser visto por outros arquivos dentro do seu programa, esse assunto será explorado de melhor forma quando for abordado o tema de programação orientada a objetos, mas saiba que são quatro os modificadores de acesso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;public&lt;/strong&gt; : Com esse modificador queremos dizer que ele é público e pode ser usado em outros pontos e pacotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;protected&lt;/strong&gt; : O &lt;strong&gt;protected&lt;/strong&gt; é usado em casos de &lt;strong&gt;Herança&lt;/strong&gt; e veremos mais a frente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;private&lt;/strong&gt; : Ele só poderá ser usado dentro do arquivo onde foi escrito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sem modificador&lt;/strong&gt; : Podemos não colocar nenhum modificador e isso indica que ele é visivel apenas dentro do pacote onde ele foi criado, se tentarmos usar um método em outro pacote ele não estará disponível para uso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O segundo ponto é que após a palavra &lt;strong&gt;public&lt;/strong&gt; existe a palavra &lt;strong&gt;String&lt;/strong&gt; e esse é um ponto obrigatório na linguagem, todo método necessita de um retorno que indica o que aquele método irá devolver ao final do processamento, nesse caso o código retorna uma &lt;strong&gt;String&lt;/strong&gt; , que pode ser visto com o trecho &lt;strong&gt;return “Olá Mundo”&lt;/strong&gt; onde a palavra &lt;strong&gt;return&lt;/strong&gt; também é obrigatória quando existe algum retorno, pode parecer contraditório estar escrito que é obrigatório haver um retorno de método sempre mas não ser obrigatório a palavra &lt;strong&gt;return&lt;/strong&gt; mas isso acontece pois nem todo método retorna alguma coisa mas todo método precisa de um retorno. Pode ter ficado meio confuso mas já explico, um método por vezes pode ser somente uma execução sem ter um valor para retornar, para ser mais claro segue um exemplo de um método que exibe um texto no console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printHelloWorld&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá Mundo!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;printHelloWorld&lt;/strong&gt; não tem um valor para ser retornado após a sua execução, ele só exibe uma mensagem e acaba, para esses casos ainda assim é necessário informar um retorno na assinatura desse método e pensando nisso é usada a palavra reservada &lt;strong&gt;void&lt;/strong&gt; que indica que esse método é uma execução mas que não retorna nada após o seu fim, sendo assim não é necessário a palavra &lt;strong&gt;return&lt;/strong&gt; dentro do método.&lt;/p&gt;

&lt;p&gt;Após isso é necessário definir o nome do método, em &lt;strong&gt;Java&lt;/strong&gt; usamos o que chamamos de &lt;em&gt;camel case&lt;/em&gt; para nomenclaturas tanto de métodos como variáveis ou classes onde escrevemos tudo junto em minúsculo e separamos as palavras com letras maiúsculas então nesse caso o nome do método ficou &lt;em&gt;printHelloWorld&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Todo método após o seu nome possui parênteses &lt;strong&gt;()&lt;/strong&gt; isso serve para quando é necessário passar &lt;strong&gt;argumentos&lt;/strong&gt; para um método, você já viu isso antes no método &lt;strong&gt;main&lt;/strong&gt; onde ele possui &lt;strong&gt;String[] args&lt;/strong&gt;, um array de argumentos, porém mesmo que não exista &lt;strong&gt;argumentos&lt;/strong&gt; em um método é necessário ter os &lt;strong&gt;parênteses&lt;/strong&gt; , para deixar claro como é um método onde existem argumentos segue o exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printHelloWorld&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá Mundo "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método acima possui o que é chamado de parâmetros, que é a forma de passar informação para a execução de um método. Nesse caso é passado a variável chamada &lt;em&gt;nome&lt;/em&gt; que é do tipo &lt;strong&gt;String&lt;/strong&gt; para que seja executada dentro do método &lt;strong&gt;printHelloWorld&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Um método pode ter nenhum ou vários parâmetros como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printHelloWorld&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" que tem "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" anos!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Toda essa sintaxe de &lt;strong&gt;modificadores de acesso&lt;/strong&gt; , &lt;strong&gt;retorno do método&lt;/strong&gt; , &lt;strong&gt;nomenclatura&lt;/strong&gt; e &lt;strong&gt;argumentos&lt;/strong&gt; é chamado de assinatura do método.&lt;/p&gt;

&lt;p&gt;Em um método que possui um retorno diferente de &lt;strong&gt;void&lt;/strong&gt; é possível que o seu valor seja atribuído a uma variável para que seja usado em outros pontos do programa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;soma&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soma&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O valor da soma é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima foi definido o método &lt;strong&gt;soma&lt;/strong&gt; que recebe dois argumentos como parâmetros do tipo &lt;strong&gt;int&lt;/strong&gt; , executa a soma e retorna o valor. Foi possível capturar o retorno do método e atribuí-lo à variável &lt;strong&gt;resultado&lt;/strong&gt; que foi usada mais abaixo para exibir a mensagem.&lt;/p&gt;

&lt;p&gt;Para que os métodos acima sejam executadas e funcionem é necessário uma instância de classe pois todo método ou variável que não for &lt;strong&gt;static&lt;/strong&gt; pertence a uma instância de classe, esse assunto será amplamente abordado em orientação a objetos. Isso significa que é necessário construir um objeto e usar o operador de acesso &lt;strong&gt;.&lt;/strong&gt; (ponto):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploMetodos&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;helloWorld&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá Mundo!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ExemploMetodos&lt;/span&gt; &lt;span class="n"&gt;exemploMetodos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ExemploMetodos&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;exemploMetodos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;helloWorld&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima foi criada a classe &lt;strong&gt;ExemploMetodos&lt;/strong&gt; que possui o método &lt;strong&gt;helloWorld&lt;/strong&gt; mas só será possível usar o método se existir uma instância ou objeto criado da classe &lt;strong&gt;ExemploMetodos&lt;/strong&gt; e para acessar o método dessa instância é necessário usar o operador &lt;strong&gt;.&lt;/strong&gt; (ponto).&lt;/p&gt;

&lt;h2&gt;
  
  
  Escopo
&lt;/h2&gt;

&lt;p&gt;No &lt;strong&gt;Java&lt;/strong&gt; uma variável é acessível dentro do bloco onde ela foi criada e isso é chamado de &lt;strong&gt;escopo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Para entender o que é escopo é necessário ver os códigos que foram feitos até aqui:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploEscopo&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mostraIdade&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A idade é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mostraIdadeII&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A idade é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima não compila no método &lt;strong&gt;mostraIdadeII&lt;/strong&gt; com o erro: &lt;strong&gt;Cannot resolve symbol ‘idade’&lt;/strong&gt;. Mesmo a variável &lt;strong&gt;idade&lt;/strong&gt; existindo no método &lt;strong&gt;mostraIdade&lt;/strong&gt; o escopo dela é pertencente ao método onde ela foi declarada então ela se torna inacessível fora do método &lt;strong&gt;mostraIdade&lt;/strong&gt;. Para o código acima funcionar seria necessário definir a variável &lt;strong&gt;idade&lt;/strong&gt; em um escopo onde ela fosse visível nos dois métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploEscopo&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mostraIdade&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A idade é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mostraIdadeII&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A idade é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora a variável &lt;strong&gt;idade&lt;/strong&gt; está em um escopo maior e é visível em dentro da classe &lt;strong&gt;ExemploEscopo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Todos os blocos no &lt;strong&gt;Java&lt;/strong&gt; possuem contexto de escopo, seja classes, métodos, condicionais ou laços de repetição isso significa que uma variável definida dentro de um bloco &lt;strong&gt;if/else&lt;/strong&gt; só existe dentro do bloco, ela nasce e morre dentro do bloco não sendo acessível fora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;metodoEscopoIf&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O valor é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código acima também não compila com o erro: &lt;strong&gt;Cannot resolve symbol ‘valor’&lt;/strong&gt;. Isso ocorre por que mesmo que esse bloco &lt;strong&gt;if&lt;/strong&gt; sempre seja executado, pois é um bloco &lt;strong&gt;if&lt;/strong&gt; com &lt;strong&gt;true&lt;/strong&gt; , a variável &lt;strong&gt;valor&lt;/strong&gt; é inciada dentro do bloco &lt;strong&gt;if&lt;/strong&gt; e “vive” somente dentro do bloco &lt;strong&gt;if&lt;/strong&gt; após encerrar o bloco a variável &lt;strong&gt;valor&lt;/strong&gt; deixa de existir.&lt;/p&gt;

&lt;p&gt;O mesmo é válido para laços de repetição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O valor do indice é "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mais uma vez esse código não compila e o erro é o mesmo, pois a variável &lt;strong&gt;indice&lt;/strong&gt; foi inicializada dentro do bloco &lt;strong&gt;for&lt;/strong&gt; e não existe e não é visível fora do bloco.&lt;/p&gt;

&lt;p&gt;O conceito de escopo é aplicável para todos os bloco de códigos sejam eles os outros blocos condicionais, estruturas de repetição ou classes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursão
&lt;/h2&gt;

&lt;p&gt;Recursividade é a capacidade de um código se executar repetidas vezes. Para explicar melhor será mais fácil exemplificar a recursão com exemplos, então imaginando um problema onde desejamos exibir na tela a sequência de um número até 0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirSequencia&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;exibirSequencia&lt;/span&gt;&lt;span class="o"&gt;(--&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código usa recursão para exibir a sequência de números. Mas vamos entender linha por linha como a recursão é executada nesse código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando o valor de &lt;strong&gt;numero&lt;/strong&gt; for igual a 0 (zero), para a chamada do método recursivo.&lt;/li&gt;
&lt;li&gt;O valor atual da variável &lt;strong&gt;número&lt;/strong&gt; é exibida.&lt;/li&gt;
&lt;li&gt;O método &lt;strong&gt;exibirSequencia&lt;/strong&gt; é executado novamente porém agora com o valor da variável &lt;strong&gt;numero&lt;/strong&gt; é pré-decrementado, diminuído, em menos 1.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um cuidado em chamadas recursivas é que facilmente podem gerar &lt;strong&gt;loops infinitos&lt;/strong&gt; e erros do tipo &lt;strong&gt;Estouro de pilha&lt;/strong&gt; ou &lt;strong&gt;StackOverflowError&lt;/strong&gt; onde a memória de execução do programa estoura, para simular esse erro não é difícil no código que testamos, basta alterar o pré-decremento da variável &lt;strong&gt;numero&lt;/strong&gt; para pós-decremento e testar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirSequencia&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;exibirSequencia&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numero&lt;/span&gt;&lt;span class="o"&gt;--);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código irá executar várias vezes com o mesmo resultado mas em algum momento irá quebrar com o seguinte erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="s"&gt;"main"&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;StackOverflowError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por esses motivos é recomendado só usar recursão em casos pequenos ou fáceis de monitorar, pois algoritmos mais complexos podem causar erros que só podem ser percebidos posteriormente ou que são difíceis de entender.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nesse artigo foi apresentado métodos, como criá-los e usá-los, também foi mostrado sobre assinatura de métodos, &lt;strong&gt;modificadores de acesso&lt;/strong&gt; , &lt;strong&gt;retorno&lt;/strong&gt; e &lt;strong&gt;parâmetros&lt;/strong&gt; ; aprendeu também sobre escopos e como o &lt;strong&gt;Java&lt;/strong&gt; lida com blocos de contexto.&lt;/p&gt;

&lt;p&gt;E por fim também foi apresentado &lt;strong&gt;recursão&lt;/strong&gt; que é uma ferramenta muito importante da linguagem mas que deve ser usada com cuidado para não gerar erros inesperados.&lt;/p&gt;

&lt;p&gt;No próximo artigo iremos entrar em Programação Orientada a Objetos.&lt;/p&gt;

&lt;p&gt;O código dos exemplos está no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visite também o nosso canal no &lt;a href="https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt; para mais acompanhar essa série de &lt;strong&gt;Primeiros passos com o Java&lt;/strong&gt; e muito mais conteúdos sobre programação.&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Primeiros passos com Java II - Estruturas condicionais, laços de repetição e arrays</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Tue, 21 Sep 2021 13:11:13 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-pt2-g2g</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-pt2-g2g</guid>
      <description>&lt;p&gt;No &lt;a href="https://programadev.com.br/java-iniciante/" rel="noopener noreferrer"&gt;artigo&lt;/a&gt; anterior foi apresentado a linguagem Java, foi abordado um pouco da história, como criar um projeto &lt;strong&gt;Java&lt;/strong&gt; no &lt;strong&gt;IntelliJ&lt;/strong&gt;, variáveis, contantes, tipos e operadores.&lt;/p&gt;

&lt;p&gt;Dando continuidade nesse artigo será abordado as estruturas de controle do &lt;strong&gt;Java&lt;/strong&gt; como condicionais, laços de repetição e &lt;strong&gt;arrays&lt;/strong&gt;. No final desse artigo você será capaz de entender o propósito de cada uma dessas estruturas de controle, saberá como usá-las e também será abordado o tema &lt;strong&gt;arrays&lt;/strong&gt; e como eles se relacionam com laços de repetição.&lt;/p&gt;

&lt;h2&gt;
  
  
  If/Else
&lt;/h2&gt;

&lt;p&gt;A primeira estrutura de controle a ser abordada será a estrutura de controle condicional &lt;strong&gt;If/Else&lt;/strong&gt; que pode ser traduzido para &lt;strong&gt;Se/Senão&lt;/strong&gt;. Essa estrutura faz uso direto da lógica &lt;strong&gt;Booleana&lt;/strong&gt; que foi vista no primeiro artigo para que alguma decisão seja tomada no código.&lt;/p&gt;

&lt;p&gt;A estrutura &lt;strong&gt;if/else&lt;/strong&gt; funciona a partir de um valor &lt;em&gt;booleano&lt;/em&gt; onde caso seja verdadeiro entrará na primeira condição e caso não seja verdadeiro entrará na segunda opção:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="n"&gt;declaração&lt;/span&gt;&lt;span class="o"&gt;*){&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para entender melhor vamos explorar um exemplo básico onde temos um software que precisa avaliar se uma pessoa é maior de 18 anos e caso seja irá exibir uma mensagem e caso não seja irá exibir outra, vamos também aproveitar para começar a ver algumas bibliotecas padrão do Java que nos auxiliam como a API &lt;em&gt;java.time&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;LocalDate&lt;/span&gt; &lt;span class="n"&gt;dataNascimento&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1986&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mo"&gt;03&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dataHoje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;LocalDate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;now&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="nc"&gt;Period&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;between&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataNascimento&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dataHoje&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getYears&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"É maior de idade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Não é maior de idade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fim da execução"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entendo o código acima temos a utilização da classe &lt;strong&gt;LocalDate&lt;/strong&gt; que vem do pacote &lt;em&gt;java.time&lt;/em&gt; que foi inserido no &lt;strong&gt;Java 8&lt;/strong&gt; e facilita muito o trabalho com datas, fazemos uso do método &lt;em&gt;of&lt;/em&gt;, não se preocupe agora em entender o que é um método mas saiba que ele representa uma ação que será executada, onde é passado o ano, mês e dia e então é atribuído a uma variável chamada &lt;strong&gt;dataNascimento&lt;/strong&gt;, logo abaixo é usado novamente a classe &lt;strong&gt;LocalDate&lt;/strong&gt; porém com o método &lt;em&gt;now&lt;/em&gt; que é usado quando queremos capturar a data atual e por fim atribuímos ele na variável &lt;strong&gt;dataHoje&lt;/strong&gt;, note que foi utilizado a palavra reservada &lt;strong&gt;var&lt;/strong&gt; ao invés da classe &lt;strong&gt;LocalDate&lt;/strong&gt; que é um recurso do &lt;strong&gt;Java 9&lt;/strong&gt; e foi deixado aqui pra exemplo, em um caso real é bom manter um padrão onde deixamos todas as variáveis com &lt;strong&gt;var&lt;/strong&gt; ou com o seu retorno para não haver confusão no código. Por fim logo abaixo foi utilizado a classe &lt;strong&gt;Period&lt;/strong&gt; e o método &lt;em&gt;between&lt;/em&gt; que faz a comparação entre duas data e conseguimos extrair o período entre elas.&lt;/p&gt;

&lt;p&gt;A classe &lt;strong&gt;Period&lt;/strong&gt; possui algumas informações que podemos trabalhar e entre elas trás o período de anos entre as duas datas e com isso conseguimos aplicar a lógica que pretendemos, que é verificar se pela data de nascimento já se passaram 18 anos ou não, então focando no trecho que interessa para entender a estrutura &lt;strong&gt;if&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getYears&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se fossemos ler esse trecho poderíamos ler da seguinte forma: &lt;strong&gt;Se for verdade que o período de anos é maior do que 18 então...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dessa forma caso isso seja verdade então o código a ser executado será o que estiver entre as chaves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getYears&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"É maior de idade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E para entender a estrutura &lt;strong&gt;else&lt;/strong&gt; basta entender que caso a condição dentro do bloco &lt;strong&gt;if&lt;/strong&gt; não seja verdadeira quem será executado será o que estiver entre chaves após a palavra &lt;strong&gt;else&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getYears&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"É maior de idade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Não é maior de idade"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então rodando o exemplo acima de uma pessoa com data de nascimento em 25 de Março de 1986 (35 anos) a saída no terminal será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;É maior de idade
Fim da execução
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repassando mais uma vez passo a passo a execução do código dando foco ao bloco &lt;strong&gt;if/else&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1° Dentro do bloco &lt;strong&gt;if&lt;/strong&gt; foi avaliado se 35 é maior do que 18.&lt;/li&gt;
&lt;li&gt;2° Isso sendo verdade &lt;strong&gt;true&lt;/strong&gt; ele "entrou" dentro da primeira condição e executou o que tinha lá dentro, nesse caso o print com a frase &lt;strong&gt;É maior de idade&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;3° Não será executado o que tem dentro do &lt;strong&gt;else&lt;/strong&gt; já que o primeiro bloco foi executado.&lt;/li&gt;
&lt;li&gt;4° Prosseguiu com o programa e printou a frase &lt;strong&gt;Fim da execução&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um último ponto importante do &lt;strong&gt;if/else&lt;/strong&gt; no &lt;strong&gt;Java&lt;/strong&gt; é que as chaves &lt;strong&gt;{}&lt;/strong&gt; no if não são obrigatórias porém caso sejam omitidas somente a primeira linha após o &lt;strong&gt;if&lt;/strong&gt; será executada como sendo parte do bloco &lt;strong&gt;if&lt;/strong&gt;, isso facilita a escrita mas pode gerar confusões e bugs onde comportamentos que só deveriam ser executados dentro do &lt;strong&gt;if&lt;/strong&gt; aparentemente estão sendo executados fora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getYears&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Executa lógica do if"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Só pode executar se for maior de 40"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fim da execução"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Olhando para o código acima parece que a intenção é executar os dois prints somente se for maior de 40 anos, porém rodando esse código a saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Só pode executar se &lt;span class="k"&gt;for &lt;/span&gt;maior de 40
Fim da execução
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso ocorreu por que somente a primeira linha após o &lt;strong&gt;if&lt;/strong&gt; foi considerada ao bloco, é como se para o compilador o código estivesse assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getYears&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Executa lógica do if"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Só pode executar se for maior de 40"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fim da execução"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nesse caso foi avaliado que 35 não é maior do que 40 e não foi executado a primeira linha porém o programa prosseguiu e executou a linha que o desenvolvedor não queria que fosse executada caso a idade fosse menor do que 40, gerando um bug no código que nem sempre é fácil de entender a primeira vista.&lt;/p&gt;

&lt;h2&gt;
  
  
  Switch
&lt;/h2&gt;

&lt;p&gt;Agora vamos imaginar que você é um desenvolvedor em uma empresa de pagamentos eletrônicos e você precisa receber os pagamentos de diversas bandeiras de cartão e processá-los, nesse exemplo hipotético você poderia usar uma estrutura &lt;strong&gt;if/else if/if&lt;/strong&gt; para processar essa lógica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cartao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Master"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Master"&lt;/span&gt;&lt;span class="o"&gt;)){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Master"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Visa"&lt;/span&gt;&lt;span class="o"&gt;)){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Visa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Amex"&lt;/span&gt;&lt;span class="o"&gt;)){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Amex"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Elo"&lt;/span&gt;&lt;span class="o"&gt;)){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Elo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Não sei o cartão"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A estrutura &lt;strong&gt;if/else if/else&lt;/strong&gt; não foi abordada no tópico anterior por um motivo, esse código é difícil de ler e dar manutenção e eu considero uma má prática.&lt;/p&gt;

&lt;p&gt;Pensando nisso existe a estrutura &lt;strong&gt;switch&lt;/strong&gt; onde existe um pouco mais de legibilidade do código, apresentando a estrutura &lt;strong&gt;switch&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="n"&gt;declaração&lt;/span&gt;&lt;span class="o"&gt;*){&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;condição&lt;/span&gt;&lt;span class="o"&gt;*:&lt;/span&gt;
    &lt;span class="c1"&gt;//Ação&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;//Ação&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A estrutura do &lt;strong&gt;switch&lt;/strong&gt; é maior mas não é complicada, na inicialização do bloco &lt;strong&gt;switch&lt;/strong&gt; informamos o dado que deve ser avaliado, e aqui entra um ponto importante do &lt;strong&gt;switch&lt;/strong&gt; já que ele trabalha com outros tipos de dados diferentemente do &lt;strong&gt;if/else&lt;/strong&gt; que só trabalha com &lt;strong&gt;boolean&lt;/strong&gt;, podendo trabalhar com os tipos primitivos byte, short, char, e int, também trabalha com &lt;strong&gt;Enums&lt;/strong&gt;, ainda não chegamos nesse assunto mas em breve chegaremos, &lt;strong&gt;Strings&lt;/strong&gt; e as classes &lt;strong&gt;Wrappers&lt;/strong&gt; &lt;strong&gt;Character&lt;/strong&gt;, &lt;strong&gt;Byte&lt;/strong&gt;, &lt;strong&gt;Short&lt;/strong&gt;, e &lt;strong&gt;Integer&lt;/strong&gt;, também não chegamos nelas mas logo será abordado.&lt;/p&gt;

&lt;p&gt;Voltando ao &lt;strong&gt;switch&lt;/strong&gt;, informamos o que será avaliado e caso seja algum dos valores que determinamos nas cláusulas &lt;strong&gt;case&lt;/strong&gt; o código é executado, por fim caso nenhum dos &lt;strong&gt;case&lt;/strong&gt; seja executado a cláusula &lt;strong&gt;default&lt;/strong&gt; é executada, vamos ver como ficaria o exemplo de cartões utilizando essa abordagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cartao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Master"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Master"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Master"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Visa"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Visa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Amex"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Amex"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Elo"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Elo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Não sei o cartão"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando esse código a saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Processa Master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código fica mais fácil de ler, você pode estar se perguntando: O que significa o &lt;strong&gt;break&lt;/strong&gt; dentro do &lt;strong&gt;switch&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Ele serve como cláusula de escape do bloco &lt;strong&gt;switch&lt;/strong&gt;, isso significa que se não fosse adicionado o &lt;strong&gt;break&lt;/strong&gt; em cada &lt;strong&gt;case&lt;/strong&gt; a partir do momento em que um &lt;strong&gt;case&lt;/strong&gt; fosse executado todos os abaixo seriam executados, vamos tirar o &lt;strong&gt;break&lt;/strong&gt; e executar o código para deixar claro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cartao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Master"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cartao&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Master"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Master"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Visa"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Visa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Amex"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Amex"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"Elo"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Processa Elo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Não sei o cartão"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Processa Master
Processa Visa
Processa Amex
Processa Elo
Não sei o cartão
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como o valor era &lt;strong&gt;Master&lt;/strong&gt; e ele era o primeiro &lt;strong&gt;case&lt;/strong&gt; após ele ser executado todos os outros &lt;strong&gt;case&lt;/strong&gt; foram executados e até mesmo o &lt;strong&gt;default&lt;/strong&gt; foi executado.&lt;/p&gt;

&lt;p&gt;Outra combinação possível é a situação onde mais de um &lt;strong&gt;case&lt;/strong&gt; possui o mesmo processamento, vamos imaginar que queremos processar os meses do ano que tem 30 dias ou 31 dias podemos fazer assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mês com 31 dias"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mês com 30 dias"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fevereiro pode ter 28 ou 29 dias"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Mês inválido"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saída desse programa será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Mês com 31 dias
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É possível aninhar cláusulas &lt;strong&gt;case&lt;/strong&gt; mas tomando cuidado para isso não ferir a legibilidade do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  While
&lt;/h2&gt;

&lt;p&gt;O bloco &lt;strong&gt;while&lt;/strong&gt; inaugura um tipo diferente de estrutura de controle, pois ele é uma estrutura de repetição e ele pode ser traduzido como &lt;strong&gt;enquanto&lt;/strong&gt;, isso significa que ele irá se repetir enquanto uma condição for verdadeira, então podemos entender que o bloco &lt;strong&gt;while&lt;/strong&gt; trabalha com &lt;strong&gt;booleanos&lt;/strong&gt;. Para ficar mais claro segue a declaração do bloco &lt;strong&gt;while&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="n"&gt;condição&lt;/span&gt;&lt;span class="o"&gt;*){&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos ver é bem curta a declaração dele.&lt;/p&gt;

&lt;p&gt;Então vamos imaginar um problema simples onde queremos mostrar na tela os números de 0 à 5, o &lt;strong&gt;while&lt;/strong&gt; poderia ser usado nesses casos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rodando o código termos como saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0
1
2
3
4
5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O interessante nesse código é que foi feito uso de pós-incremento com o operador &lt;strong&gt;++&lt;/strong&gt;, então analisando passo-a-passo o código:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1° A variável &lt;strong&gt;indice&lt;/strong&gt; começa com o valor 0.&lt;/li&gt;
&lt;li&gt;2° O bloco &lt;strong&gt;while&lt;/strong&gt; faz a checagem se o valor de &lt;strong&gt;indice&lt;/strong&gt; é menor ou igual a 5, se for executa o que estiver dentro do bloco &lt;strong&gt;while&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;3° Dentro do bloco &lt;strong&gt;while&lt;/strong&gt; printa na tela o valor atual da variável &lt;strong&gt;indice&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;4° Pós-incrementa o valor da variável &lt;strong&gt;indice&lt;/strong&gt; em 1 então nesse momento ela irá valer 1.&lt;/li&gt;
&lt;li&gt;5° Retorna para o início do bloco &lt;strong&gt;while&lt;/strong&gt; e verifica se o valor da variável &lt;strong&gt;indice&lt;/strong&gt; é menor ou igual a 5, se for executa tudo de novo e se não for sai do laço de repetição. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O laço &lt;strong&gt;while&lt;/strong&gt; também é muito usado quando se trabalha com &lt;strong&gt;Iterators&lt;/strong&gt; que são coleções de dados no &lt;strong&gt;Java&lt;/strong&gt; ligadas umas as outras onde cada uma sabe se existe um próximo na lista, mas não veremos isso por enquanto pois hoje em dia os &lt;strong&gt;Iterators&lt;/strong&gt; perderam um pouco da força que tinham pois existem outras formas que as versões mais novas do &lt;strong&gt;Java&lt;/strong&gt; lidam com esse tipo de estrutura de dados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do/While
&lt;/h2&gt;

&lt;p&gt;Agora iremos entender a estrutura &lt;strong&gt;Do/While&lt;/strong&gt;, que seria algo mais parecido com &lt;strong&gt;Faça/Enquanto&lt;/strong&gt; traduzindo literalmente para o português, apesar da palavra &lt;strong&gt;while&lt;/strong&gt; existir a ideia dele é um pouco diferente da estrutura &lt;strong&gt;while&lt;/strong&gt; do tópico acima. A ideia por trás desse laço de repetição é que uma ação seja executada primeiramente e após isso seja avaliado se deve ser repetida ou não, a declaração dele é assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;declaração&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(*&lt;/span&gt;&lt;span class="n"&gt;expressão&lt;/span&gt;&lt;span class="o"&gt;*);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No trecho de código acima existe a inicialização do bloco com a palavra &lt;strong&gt;do&lt;/strong&gt;, então o que estiver dentro desse bloco será executado pelo menos uma vez e após isso existe a palavra &lt;strong&gt;while&lt;/strong&gt; onde será avaliada alguma expressão &lt;strong&gt;booleana&lt;/strong&gt; e caso seja &lt;strong&gt;true&lt;/strong&gt; irá repetir o que estiver dentro do bloco &lt;strong&gt;do&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos pensar em um exemplo onde queremos mostrar na tela os números de 0 até 10 usando a estrutura &lt;strong&gt;do/while&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;contador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Contador é: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;contador&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;contador&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contador&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Finalizado programa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rodando esse programa a saída na tela será assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Contador é: 0
Contador é: 1
Contador é: 2
Contador é: 3
Contador é: 4
Contador é: 5
Contador é: 6
Contador é: 7
Contador é: 8
Contador é: 9
Contador é: 10
Finalizado programa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba que no início do código o bloco &lt;strong&gt;do&lt;/strong&gt; é executado de primeira, imprime na tela a mensagem, após isso o valor da variável &lt;strong&gt;contador&lt;/strong&gt; é incrementada, na sequência é avaliado dentro do &lt;strong&gt;while&lt;/strong&gt; se o valor da variável &lt;strong&gt;contador&lt;/strong&gt; é menor do que 11 e caso seja verdade (&lt;strong&gt;true&lt;/strong&gt;) é repetido o fluxo dentro do bloco &lt;strong&gt;do&lt;/strong&gt;, quando a variável &lt;strong&gt;contador&lt;/strong&gt; chega o valor 11 o programa sai da estrutura &lt;strong&gt;do/while&lt;/strong&gt; e o programa continua.&lt;/p&gt;

&lt;p&gt;Para deixar um exemplo um pouco mais real ao invés de ficar percorrendo por números, vamos imaginar um programa que simule um despertador, ele irá tocar a primeira vez e depois irá verificar se está no modo soneca, caso ainda esteja irá tocar até que a pessoa desligue o alarme.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;InterruptedException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SOAR ALARME: dim! drim! alarme de relógio"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;despertadorEstaNaSoneca&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Finalizado programa"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;despertadorEstaNaSoneca&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;InterruptedException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;nextBoolean&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explicando o código acima temos o bloco &lt;strong&gt;do&lt;/strong&gt; que inicia o despertador, na sequência temos um método chamado &lt;em&gt;despertadorEstaNaSoneca&lt;/em&gt; que verifica se ainda está na soneca e devolve um &lt;strong&gt;booleano&lt;/strong&gt;, ele usa o &lt;strong&gt;Thread.sleep(1000);&lt;/strong&gt; para esperar um segundo e depois executa o &lt;strong&gt;new Random().nextBoolean();&lt;/strong&gt; que escolhe se será &lt;strong&gt;true&lt;/strong&gt; ou &lt;strong&gt;false&lt;/strong&gt; randomicamente, isso significa que aleatoriamente vai ser escolhido se será &lt;strong&gt;true&lt;/strong&gt; ou &lt;strong&gt;false&lt;/strong&gt;, enquanto o &lt;em&gt;despertadorEstaNaSoneca&lt;/em&gt; rodar e for &lt;strong&gt;true&lt;/strong&gt; o bloco &lt;strong&gt;do&lt;/strong&gt; irá se repetir. Não se preocupe muito com toda a sintaxe pois tudo isso será explicado mais pra frente, no momento em que foi rodado esse programa a saída foi:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SOAR ALARME: dim! drim! alarme de relógio
SOAR ALARME: dim! drim! alarme de relógio
Finalizado programa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se for executado de novo esse programava pode haver mudança pois como é escolhido de forma aleatoria se é &lt;strong&gt;true&lt;/strong&gt; ou &lt;strong&gt;false&lt;/strong&gt; pode ser que demore mais.&lt;/p&gt;

&lt;h2&gt;
  
  
  For
&lt;/h2&gt;

&lt;p&gt;O laço de repetição &lt;strong&gt;for&lt;/strong&gt; é uma estrutura de repetição para situações onde é conhecido quantas vezes é necessário repetir uma tarefa. Em comparação com &lt;strong&gt;while&lt;/strong&gt; e &lt;strong&gt;do/while&lt;/strong&gt; onde o laço será repetido até que uma condição seja atendida a declaração do &lt;strong&gt;for&lt;/strong&gt; já pede de antemão que seja informado a quantidade de vezes que será executado o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;declaração&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;declaração&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;declaração&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// código a ser executado&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Entendendo cada parte da declaração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A primeira declaração é executada uma vez dentro do bloco &lt;strong&gt;for&lt;/strong&gt; e é a inicialização da variável de controle.&lt;/li&gt;
&lt;li&gt;A segunda declaração define a condição que será executada no bloco &lt;strong&gt;for&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A terceira declaração será executada sempre que houver uma repetição no bloco &lt;strong&gt;for&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adicionando um exemplo mais prático iremos imprimir na tela os números de 0 até 10:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E a saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;0
1
2
3
4
5
6
7
8
9
10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que as três condições do bloco &lt;strong&gt;for&lt;/strong&gt; foram atendidas, primeiro iniciamos uma variável chamada &lt;em&gt;indice&lt;/em&gt; com valor 0, depois foi definido a condição de parada desse bloco sendo o valor da variável &lt;em&gt;indice&lt;/em&gt; menor ou igual a 10 e por fim declaramos que a cada fez que o bloco for repetido o valor de &lt;em&gt;indice&lt;/em&gt; deve ser incrementado em 1 e dentro do bloco mandamos imprimir o valor atual da variável &lt;em&gt;indice&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;É muito útil esse laço de repetição quando estamos trabalhando com listas do &lt;strong&gt;Java&lt;/strong&gt; pois essa estrutura de dados já possui formas para sabermos o seu tamanho total, no exemplo abaixo fica um pouco mais claro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Arroz"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Feijão"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Macarrão"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Óleo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima simulamos que temos uma lita de mercado e no laço &lt;strong&gt;for&lt;/strong&gt; fazemos uso do método &lt;strong&gt;size&lt;/strong&gt; que já diz qual é o tamanho dessa lista e dentro do bloco &lt;strong&gt;for&lt;/strong&gt; mandamos imprimir o valor da lista de acordo com o índice. Valendo ressaltar que ainda não foi abordado listas e coleções de dados mas adiantando que listas no &lt;strong&gt;Java&lt;/strong&gt; são coleções de dados que começam com o seu índice em 0.&lt;/p&gt;

&lt;p&gt;Executando esse código a saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Arroz
Feijão
Macarrão
Óleo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existe outra forma de executar o laço &lt;strong&gt;for&lt;/strong&gt; que é chamado de &lt;strong&gt;Enhanced-for&lt;/strong&gt; ou &lt;strong&gt;for melhorado&lt;/strong&gt; em tradução livre e é assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele possui uma forma mais curta para escrever o código &lt;strong&gt;for&lt;/strong&gt; porém ele só é possível de ser feito em coleções de dados que tenham o método &lt;strong&gt;size&lt;/strong&gt; implementado pois por debaixo dos panos ele vai executar um &lt;strong&gt;for&lt;/strong&gt; tradicional, ele é mais uma facilidade para o desenvolvedor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Break/Continue
&lt;/h2&gt;

&lt;p&gt;Agora que foi apresentado as estruturas de controles e repetições iremos ver as cláusulas &lt;strong&gt;break&lt;/strong&gt; e &lt;strong&gt;continue&lt;/strong&gt;, o &lt;strong&gt;break&lt;/strong&gt; foi previamente apresentado na explicação do &lt;strong&gt;switch&lt;/strong&gt; e agora ele será aprofundado em detalhes.&lt;/p&gt;

&lt;p&gt;Imagine a seguinte situação onde você, como desenvolvedor, precisa escrever um código onde você possui uma lista e se houver algum valor específico nessa lista você precisa que pare todo o processamento ou dependendo do valor você quer ignorar e ir para o próximo valor, como poderia ser feito isso? É isso que o &lt;strong&gt;break&lt;/strong&gt; e o &lt;strong&gt;continue&lt;/strong&gt; fazem, vamos abordar primeiramente o &lt;strong&gt;break&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A cláusula &lt;strong&gt;break&lt;/strong&gt; interrompe um laço de repetição ou no caso do switch para sair do bloco, vamos ver no exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"i = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Vai sair do for no valor 5"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"proxima iteracao"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Finalizou"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E a saída desse programa será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;i &lt;span class="o"&gt;=&lt;/span&gt; 0
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 1
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 2
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 3
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 4
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 5
Vai sair &lt;span class="k"&gt;do &lt;/span&gt;loop no valor 5
Finalizou
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se não houvesse o &lt;strong&gt;break&lt;/strong&gt; nesse código ele iria imprimir até o valor 10 pra depois finalizar mas o &lt;strong&gt;break&lt;/strong&gt; forçou o encerramento dele, o mesmo podemos fazer com &lt;strong&gt;while&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"i = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Vai sair do while no valor 7"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E teremos como saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;i &lt;span class="o"&gt;=&lt;/span&gt; 0
i &lt;span class="o"&gt;=&lt;/span&gt; 1
i &lt;span class="o"&gt;=&lt;/span&gt; 2
i &lt;span class="o"&gt;=&lt;/span&gt; 3
i &lt;span class="o"&gt;=&lt;/span&gt; 4
i &lt;span class="o"&gt;=&lt;/span&gt; 5
i &lt;span class="o"&gt;=&lt;/span&gt; 6
i &lt;span class="o"&gt;=&lt;/span&gt; 7
Vai sair &lt;span class="k"&gt;do while &lt;/span&gt;no valor 7
Finalizou
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas e se precisarmos somente ignorar algum valor mas sem parar o processamento?&lt;/p&gt;

&lt;p&gt;Para esse caso entra a cláusula &lt;strong&gt;continue&lt;/strong&gt; que vai pular aquela iteração e passar para a próxima, vamos ver no exemplo abaixo para ficar mais claro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Vai pular no valor 5"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"i = "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Proxima iteracao"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Finalizou"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E teremos como saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;i &lt;span class="o"&gt;=&lt;/span&gt; 0
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 1
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 2
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 3
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 4
Proxima iteracao
Vai pular no valor 5
i &lt;span class="o"&gt;=&lt;/span&gt; 6
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 7
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 8
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 9
Proxima iteracao
i &lt;span class="o"&gt;=&lt;/span&gt; 10
Proxima iteracao
Finalizou
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui podemos ver que no momento em que a variável &lt;strong&gt;i&lt;/strong&gt; estava com valor 5 a cláusula &lt;strong&gt;continue&lt;/strong&gt; pulou para o próximo valor e continuou o processamento. &lt;/p&gt;

&lt;h2&gt;
  
  
  Arrays
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Arrays&lt;/strong&gt; em &lt;strong&gt;Java&lt;/strong&gt; são uma forma de guardar múltiplos valores em uma única variável e isso é algo muito útil para trabalhar com coleções de dados, conjuntos ou listas.&lt;/p&gt;

&lt;p&gt;Existe duas formas de inicializar um &lt;strong&gt;array&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui podemos ver a sintaxe de um array onde é obrigatório definir o tipo desse array, o seu tamanho inicial e é necessário os colchetes &lt;strong&gt;[]&lt;/strong&gt;, podemos também declarar um &lt;strong&gt;array&lt;/strong&gt; da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;outroArray&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde os colchetes &lt;strong&gt;[]&lt;/strong&gt; estão após o nome da variável mas não é muito usual e também agora podemos declarar um &lt;strong&gt;array&lt;/strong&gt; sem precisar dizer explicitamente o seu tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;arraySemTipoExplicito&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apesar desse &lt;strong&gt;array&lt;/strong&gt; não possuir o seu explicitamente tipado na variável o compilador consegue inferir o seu tipo então apesar da variável &lt;em&gt;arraySemTipoExplicito&lt;/em&gt; não ter um tipo declarado o compilador entende que é um &lt;strong&gt;array&lt;/strong&gt; de &lt;strong&gt;int&lt;/strong&gt; com 10 posições.&lt;/p&gt;

&lt;p&gt;Um ponto em comum com essas três declarações é que quando criamos um array utilizando a palavra reservada &lt;strong&gt;new&lt;/strong&gt;, que é a palavra usada para criarmos em memória o &lt;strong&gt;array&lt;/strong&gt;, é obrigatório informar o tamanho que esse &lt;strong&gt;array&lt;/strong&gt; vai ter pois é necessário reservar espaços na memória para guardar os valores que podem ser preenchidos.&lt;/p&gt;

&lt;p&gt;Após criar um &lt;strong&gt;array&lt;/strong&gt; podemos inserir valores em cada posição dele e para isso temos que entender como um array é indexado. O índice de um array sempre começa em 0 então um array de 10 posições é acessível de 0 até 9, isso é muito importante pois se tentarmos acessar um posição inválida dentro de um &lt;strong&gt;array&lt;/strong&gt; será lançado um erro no programa.&lt;/p&gt;

&lt;p&gt;Então para adicionar valores em cada posição do &lt;strong&gt;array&lt;/strong&gt; pode ser feito dessa maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso adicionemos valor em um índice que não existe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No momento da execução será lançado o seguinte erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="s"&gt;"main"&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ArrayIndexOutOfBoundsException&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Index&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;bounds&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém existe uma outra maneira para inicializar um &lt;strong&gt;array&lt;/strong&gt; e iremos ver agora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arrayInicializado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferença é basicamente que já criamos um &lt;strong&gt;array&lt;/strong&gt; com os valores definidos.&lt;/p&gt;

&lt;p&gt;Como todo &lt;strong&gt;array&lt;/strong&gt; possui indices podemos acessar os seus valores através dos indices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayInicializado&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seguindo a mesma lógica conseguimos alterar um valor dentro de um &lt;strong&gt;array&lt;/strong&gt; pelo índice também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;arrayInicializado&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayInicializado&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora o valor que inicialmente era 1 agora será 10.&lt;/p&gt;

&lt;p&gt;Outra propriedade muito útil dos &lt;strong&gt;arrays&lt;/strong&gt; é que quando nós criamos um &lt;strong&gt;array&lt;/strong&gt; precisamos definir o seu tamanho, seja com &lt;strong&gt;new int[10]&lt;/strong&gt; ou com os valores dentro de chaves &lt;strong&gt;{}&lt;/strong&gt; e como &lt;strong&gt;arrays&lt;/strong&gt; tem tamanho fixo nós temos condições de saber o seu tamanho sendo então muito usado para laços de repetição do tipo &lt;strong&gt;for&lt;/strong&gt;, bastando com que seja usada a propriedade &lt;strong&gt;length&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arrayInicializado&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;++){&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayInicializado&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;indice&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou podemos fazer uso do &lt;strong&gt;Enhanced-for&lt;/strong&gt; também nesses casos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nl"&gt;valor:&lt;/span&gt; &lt;span class="n"&gt;arrayInicializado&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferença está no tamanho desse &lt;strong&gt;for&lt;/strong&gt; e que não precisamos acessar o &lt;strong&gt;array&lt;/strong&gt; no índice (&lt;em&gt;arrayInicializado[indice]&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Vimos até o momento o modo mais comum de utilizar &lt;strong&gt;arrays&lt;/strong&gt;, porém &lt;strong&gt;arrays&lt;/strong&gt; podem ser multidimensionais isso significa que são &lt;strong&gt;arrays&lt;/strong&gt; dentro de &lt;strong&gt;arrays&lt;/strong&gt; não é algo muito comum mas dependendo do contexto pode ser utilizado porém sinceramente em minha experiência não é algo que se vê todo dia mas é bom ter esse conhecimento caso necessite resolver problemas ou caso se depare com algo assim em algum momento, então no exemplo iremos criar um &lt;strong&gt;array&lt;/strong&gt; de duas dimensões:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;arrayDimensional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A primeira coisa que podemos notar é que precisamos adicionar dois colchetes &lt;strong&gt;[]&lt;/strong&gt; na declaração da variável &lt;strong&gt;arrayDimensional&lt;/strong&gt; e para cada &lt;strong&gt;array&lt;/strong&gt; envolvemos com chaves &lt;strong&gt;{}&lt;/strong&gt;, mas também poderíamos ter feito assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;outroArrayDimensional&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para acessar, inserir ou alterar os valores dentro de um &lt;strong&gt;array&lt;/strong&gt; multidimensional é necessário informar os dois valores, o primeiro para indicar qual &lt;strong&gt;array&lt;/strong&gt; será utilizado e outro valor para informar qual o índice queremos acessar desse &lt;strong&gt;array&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayDimensional&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então nesse exemplo queremos acessar o primeiro &lt;strong&gt;array&lt;/strong&gt;, lembrando que os índices sempre começam em 0, e dentro do primeiro &lt;strong&gt;array&lt;/strong&gt; queremos o terceiro elemento, nesse caso o valor 3.&lt;/p&gt;

&lt;p&gt;Se fosse necessário fazer um &lt;strong&gt;for&lt;/strong&gt; em &lt;strong&gt;array&lt;/strong&gt; multidimensional é possível e ficaria desse jeito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arrayDimensional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;arrayDimensional&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrayDimensional&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso não é possível fazer uso do &lt;strong&gt;Enhanced-for&lt;/strong&gt; pois é necessário trabalhar com os índices para acessar os dois &lt;strong&gt;arrays&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Podemos ver que é possível então trabalhar com &lt;strong&gt;arrays&lt;/strong&gt; tridimensionais ou até com mais dimensões porém como podemos ver no código acima a legibilidade começa a ficar comprometida e para cada dimensão a mais no &lt;strong&gt;array&lt;/strong&gt; precisaríamos aninhar outro laço &lt;strong&gt;for&lt;/strong&gt; o que pode comprometer também a performance do programa dependendo da quantidade de elementos que cada &lt;strong&gt;array&lt;/strong&gt; contenha.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Nesse artigo foi apresentado as estruturas de controle como &lt;strong&gt;if/else&lt;/strong&gt; e &lt;strong&gt;switch&lt;/strong&gt; vimos como criá-los e como usá-los, também vimos as estruturas de repetição com os laços &lt;strong&gt;while&lt;/strong&gt;, &lt;strong&gt;do/while&lt;/strong&gt; e &lt;strong&gt;for&lt;/strong&gt; como podemos trabalhar com eles e em quais momentos usar cada um. Entendemos também as cláusulas &lt;strong&gt;break&lt;/strong&gt; e &lt;strong&gt;continue&lt;/strong&gt; como elas podem ser úteis quando precisamos interromper um processamento ou então ignorar um processamento mas sem parar o fluxo e por fim foi apresentado a estrutura de dados &lt;strong&gt;array&lt;/strong&gt; e como podemos criá-los, acessar seus valores e percorrer seus dados com o laço &lt;strong&gt;for&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O link para o projeto que está no &lt;a href="https://github.com/guilhermegarcia86/helloworld" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Primeiros passos com Java</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Wed, 08 Sep 2021 15:17:17 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-36b8</link>
      <guid>https://dev.to/guilhermegarcia86/primeiros-passos-com-java-36b8</guid>
      <description>&lt;h2&gt;
  
  
  História
&lt;/h2&gt;

&lt;p&gt;Com sua primeira versão lançada em 1995 por &lt;strong&gt;James Gosling&lt;/strong&gt; pela &lt;strong&gt;Sun Microsystems&lt;/strong&gt; a linguagem &lt;strong&gt;Java&lt;/strong&gt; se popularizou muito pois usava uma síntaxe que tentava se assemelhar com C/C++ porém sem algumas das dificuldades que uma linguagem de nível mais baixo trás consigo. Ela trouxe uma abordagem diferente das linguagens que eram convencionadas à época com o lançamento da &lt;strong&gt;JVM&lt;/strong&gt; (Java Virtual Machine), um ambiente virtual onde o código é executado e a possíbilidade de executar o código em múltiplas plataformas não mais havendo a necessidade de compilar versões específicas, não que seja algo exclusivo do &lt;strong&gt;Java&lt;/strong&gt; o próprio &lt;strong&gt;Erlang&lt;/strong&gt; já fazia isso em 1986 com a sua &lt;strong&gt;virtual Machine&lt;/strong&gt;, &lt;strong&gt;JAM&lt;/strong&gt; e posteriormente com a &lt;strong&gt;BEAM&lt;/strong&gt;, com isso o &lt;strong&gt;Java&lt;/strong&gt; adotou o slogan &lt;em&gt;"Write once, run anywhere"&lt;/em&gt; (Escreva uma vez, rode em qualquer lugar). Outro ponto muito importante foi a adoção de um paradigma orientado a objetos (POO), pois era muito mais comum e utilizado o paradigma procedural apesar do C++ já possuir a possibilidade de utilizar o paradigma orientado a objetos, isso trouxe mais flexibilidade e dinâmismo ao código e por fim o terceiro ponto que considero que foi uma grande vantagem foi a utilização de um &lt;strong&gt;Garbage Collector&lt;/strong&gt;, que consiste em um mecânismo que faz o controle de memória do código, era um problema muito comum na linguagem C onde o desenvolvedor precisa lidar com alocação e liberação de memória no código, o que nem sempre é fácil ou trivial de se fazer e que acabava causando "vazamentos" de memória em aplicações. Tudo isso fez com que o &lt;strong&gt;Java&lt;/strong&gt; se tornasse muito popular para desenvolvimento de aplicações que rodassem embarcadas em outras aplicações, os &lt;strong&gt;applets&lt;/strong&gt;, desenvolvimento &lt;strong&gt;desktop&lt;/strong&gt;, &lt;strong&gt;mobile&lt;/strong&gt; e &lt;strong&gt;web&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em 2005 a &lt;strong&gt;Oracle&lt;/strong&gt; adquiriu a &lt;strong&gt;Sun&lt;/strong&gt; por US$7.4 bilhões e prometeu continuar desenvolvendo e melhorando a linguagem, algo que era uma cobrança recorrente da comunidade pois lançamentos de melhorias demoravam muito. Até o momento desse artigo o &lt;strong&gt;Java&lt;/strong&gt; está na versão 11LTS com previsão da versão 17LTS em 14 de setembro de 2021.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Para instalar basta seguir essas orientações de acordo com o seu sistema operacional:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/10/install/installation-jdk-and-jre-microsoft-windows-platforms.htm#JSJIG-GUID-A7E27B90-A28D-4237-9383-A58B416071CA" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/10/install/installation-jdk-and-jre-linux-platforms.htm#JSJIG-GUID-737A84E4-2EFF-4D38-8E60-3E29D1B884B8" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.oracle.com/javase/10/install/installation-jdk-and-jre-macos.htm#JSJIG-GUID-2FE451B0-9572-4E38-A1A5-568B77B146DE" rel="noopener noreferrer"&gt;Mac&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Iniciando um projeto
&lt;/h2&gt;

&lt;p&gt;Nesses exemplos eu irei usar a IDE &lt;strong&gt;IntelliJ&lt;/strong&gt; para criar o projeto e rodar os exemplos, a escolha é pela facilidade que essa IDE oferece de configuração e o suporte para o &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Poderíamos também criar os arquivos &lt;em&gt;.java&lt;/em&gt; e compilá-los diretamente por linha de comando com o &lt;em&gt;javac&lt;/em&gt; porém o intuito é fazer da forma mais parecida com o que é feito no dia a dia de um desenvolvedor.&lt;/p&gt;

&lt;p&gt;Primeiramente é necessário instalar o &lt;a href="https://www.jetbrains.com/help/idea/installation-guide.html" rel="noopener noreferrer"&gt;IntelliJ&lt;/a&gt;, após abrí-lo clique em &lt;strong&gt;New Project&lt;/strong&gt; como na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F7cc0abbe6b92e5ef679c923026a935a3%2Fa6d36%2Fnovo-projeto-intellij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F7cc0abbe6b92e5ef679c923026a935a3%2Fa6d36%2Fnovo-projeto-intellij.png" alt="Tela New Project" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso irá aparecer várias opções mas por enquanto basta deixar selecionado a opção &lt;strong&gt;Java&lt;/strong&gt; e clicar em &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2Fc5834354272934f5d074df58bf72da8a%2Fa6d36%2Fnovo-projeto-intellij2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2Fc5834354272934f5d074df58bf72da8a%2Fa6d36%2Fnovo-projeto-intellij2.png" alt="Tela New Project" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na próxima tela selecione a opção &lt;strong&gt;Create project from template&lt;/strong&gt; e a opção &lt;strong&gt;Command Line App&lt;/strong&gt; ficará disponível para clicar, isso já criará um programa &lt;strong&gt;Java&lt;/strong&gt; executável.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F9cf4a4e45dcd6de92bd373bfe0fc6178%2Fa6d36%2Fnovo-projeto-intellij3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F9cf4a4e45dcd6de92bd373bfe0fc6178%2Fa6d36%2Fnovo-projeto-intellij3.png" alt="Tela New Project" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E por fim é necessário nomear o projeto, definir a pasta onde será salvo e o nome do pacote base. Os dois primeiros são simples de entender mas o terceiro é necessário pois todo programa &lt;strong&gt;Java&lt;/strong&gt; é organizado em pacotes onde o código fica e este nome deve ser único por aplicação então foi convencionado de que o nome do pacote deveria ser o a &lt;strong&gt;URL&lt;/strong&gt; da empresa ao contrário nesse caso ficou assim: &lt;strong&gt;br.com.company&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E após isso basta clicar em &lt;strong&gt;Finish&lt;/strong&gt; o projeto será criado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Entendendo o primeiro projeto
&lt;/h2&gt;

&lt;p&gt;Quando um projeto novo é criado automaticamente é criado a classe &lt;strong&gt;Main.java&lt;/strong&gt; com o seguinte código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;br.com.company&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa é a sintaxe básica de um programa &lt;strong&gt;Java&lt;/strong&gt; pois todo programa executável em &lt;strong&gt;Java&lt;/strong&gt; necessita ter um método de entrada chamado &lt;strong&gt;main&lt;/strong&gt; que seja &lt;strong&gt;public static void&lt;/strong&gt;, entenderemos melhor o que isso significa adiante, e que receba um &lt;strong&gt;array&lt;/strong&gt; de &lt;strong&gt;String&lt;/strong&gt;, também entenderemos mais adiante o que isso significa, mas saiba que sem isso o programa não consegue ser executado pois no momento da execução de um programa o &lt;strong&gt;Java&lt;/strong&gt; tenta localizar um método que siga esse modelo para iniciar.&lt;/p&gt;

&lt;p&gt;Note também que na primeira linha do código aparece o nome do pacote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variáveis
&lt;/h2&gt;

&lt;p&gt;Variáveis são posições de memória que são capazes de reter e representar expressões, elas existem em tempo de execução de um programa e tem nomes que são escolhidos pelo desenvolvedor para as identificar.&lt;/p&gt;

&lt;p&gt;Esclarecendo melhor a explicação acima, uma variável nada mais é do que algo onde podemos colocar um valor e depois podemos trocar por outro, no exemplo abaixo fica um pouco mais claro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No trecho acima foi criado uma variável com nome "numero", por debaixo dos panos o &lt;strong&gt;Java&lt;/strong&gt; irá reservar um espaço em memória para guardar o valor que foi definido, primeiramente com o número 1 e em seguida foi adicionado outro valor para a variável "numero" com o valor 2. Nesse momento outro espaço de memória é criado e nele é guardado o valor 2. Isso só é possível pois estamos usando uma variável e como o seu nome dá a entender o seu valor pode ser mudado.&lt;/p&gt;

&lt;p&gt;Perceba também que antes da a variável "numero" tem a palavra &lt;strong&gt;int&lt;/strong&gt;, isso acontece pois o &lt;strong&gt;Java&lt;/strong&gt; é uma linguagem fortemente tipada, isso significa que tudo deve possuir um identificador de qual tipo é, nesse caso &lt;strong&gt;int&lt;/strong&gt; representa os números inteiros, existem outros tipos e os veremos mais adiante.&lt;/p&gt;

&lt;p&gt;Para criar uma variável é necessário informar o seu tipo, um nome e um valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;tipo&lt;/span&gt;  &lt;span class="n"&gt;nome&lt;/span&gt;     &lt;span class="n"&gt;valor&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;   &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Porém a partir do &lt;strong&gt;Java 11&lt;/strong&gt; foi adicionado inferência de tipo, que significa que não precisamos dizer qual é o tipo de uma variável que a própria linguagem irá saber o seu tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basta adicionar a palavra reservada &lt;strong&gt;var&lt;/strong&gt; que ele implicitamente irá entender que estamos trabalhando com um tipo numérico.&lt;/p&gt;

&lt;p&gt;Porém o &lt;strong&gt;Java&lt;/strong&gt; continua sendo fortemente tipado o que significa que uma variável não pode ser definida de um tipo e depois receber outro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Exemplo de código que não funciona&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código não será compilado pela linguagem e receberemos uma mensagem de erro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;numero&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código também não será compilado e também receberemos uma mensagem de erro pois mesmo sem dizer qual o tipo da variável "numero" quando atribuímos o valor "1" para ela o próprio compilador já sabe que implicitamente essa variável é de um tipo numérico e sendo assim não poderia receber outro valor que não fosse um tipo numérico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Constantes
&lt;/h2&gt;

&lt;p&gt;Nem sempre teremos valores que são mutáveis e as vezes a intenção é que não seja possível que esse valor se altere. Por exemplo imaginando que exista um programa que faça contas matemáticas e utilize o número π (PI) para calcular a circunferência de um círculo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159265359&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;circunferencia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;diametro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora suponha que por algum descuido alguém mude o valor da variável &lt;strong&gt;pi&lt;/strong&gt;, todos os lugares que usarem essa variável serão afetadas e o resultado estará errado o que pode causar inúmeros problemas como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159265359&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;circunferencia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;diametro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para solucionar esse tipo de situação existem as &lt;strong&gt;constantes&lt;/strong&gt; que são como variáveis porém o seu valor é definido uma única vez e não pode ser alterado. No &lt;strong&gt;Java&lt;/strong&gt; não existe uma declaração explícita para uma constante como existem em outras linguagem, veja abaixo o exemplo de uma constante com &lt;strong&gt;JavaScript&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159265359&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima a palavra reservada &lt;strong&gt;const&lt;/strong&gt; já indica que aquele valor não pode ser mudado, mas como estamos falando de &lt;strong&gt;Java&lt;/strong&gt; vamos entender como ele lida com isso já que não possui uma palavra reservada para constantes.&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;Java&lt;/strong&gt; existem palavras reservadas que são usadas pela linguagem para alguns fins, entre elas existem duas que iremos destacar, a palavra reservada &lt;strong&gt;final&lt;/strong&gt; e a palavra reservada &lt;strong&gt;static&lt;/strong&gt;. A palavra reservada &lt;strong&gt;final&lt;/strong&gt; é usada quando queremos que algo não possa ser modificado, seja uma variável, método ou classe (mais pra frente será explicado melhor) o que já parece ser um caminho pois com a palavra &lt;strong&gt;final&lt;/strong&gt; uma variável declarada não poderá ser modificada. A palavra reservada &lt;strong&gt;static&lt;/strong&gt; serve para indicar que algo pertence ao seu tipo e não a sua instância, eu sei que essa definição é meio confusa de entender ainda mais por que ainda não foi apresentado classes e instâncias, mas pense que isso significa que esse "algo", variável, classe ou método pode ser usado em outros pontos do programa sem que aja a necessidade de algumas burocracias que a linguagem exige. Colocando isso em prática uma constante ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159265359&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;circunferencia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;diametro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por convenção toda constante é escrita em letras maiúsculas e agora se por algum motivo alguém tentar alterar o valor da constante &lt;strong&gt;PI&lt;/strong&gt; o compilador irá exibir uma mensagem de erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Exemplo de código que não compila&lt;/span&gt;
&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.14159265359&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;circunferencia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;diametro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;raio&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima criamos a constante &lt;strong&gt;PI&lt;/strong&gt; porém no dia a dia podemos fazer uso da constante &lt;strong&gt;Math.PI&lt;/strong&gt; do pacote &lt;strong&gt;java.lang.Math&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tipos primitivos
&lt;/h2&gt;

&lt;p&gt;Como dito anteriormente a linguagem &lt;strong&gt;Java&lt;/strong&gt; é um linguagem fortemente tipada, isso significa que tudo, variáveis, constantes, métodos e classes são um tipo de dado. Existem dois tipos fundamentais no &lt;strong&gt;Java&lt;/strong&gt;, os tipos primitivos e os tipos não primitivos. Aqui iremos ver o que são os dois e qual a controvérsia que existe sobre os tipos primitivos.&lt;/p&gt;

&lt;p&gt;Um tipo primitivo é um valor diretamente guardado em memória, não é um objeto e sim o valor em si.&lt;/p&gt;

&lt;p&gt;Parece ser contraditório já que a abordagem da linguagem é ser orientada a objetos e haver tipos primitivos, que são valores armazenados diretamente na memória, porém essa foi uma estratégia adotada pela equipe de desenvolvimento do &lt;strong&gt;Java&lt;/strong&gt;, vamos entender quais são os tipos primitivos e quais valores podemos atribuir a eles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;----------------------&lt;/span&gt;|-----------|------------------------------|------------------------------|--------------|-----------|------------------------------------
Tipo                  | Primitivo |              Menor           |             Maior            | Valor Padrão | Tamanho   | Exemplo
&lt;span class="nt"&gt;----------------------&lt;/span&gt;|-----------|------------------------------|------------------------------|--------------|-----------|------------------------------------
                      |   byte    |              &lt;span class="nt"&gt;-128&lt;/span&gt;            |              127             |      0       |   8 bits  | byte b &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;byte&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="p"&gt;;&lt;/span&gt;
Inteiro               |   short   |             &lt;span class="nt"&gt;-32768&lt;/span&gt;           |             32767            |      0       |   16 bits | short s &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;short&lt;span class="o"&gt;)&lt;/span&gt; 1&lt;span class="p"&gt;;&lt;/span&gt;
                      |   int     |          &lt;span class="nt"&gt;-2&lt;/span&gt;.147.483.648      |          2.147.483.647       |      0       |   32 bits | int i &lt;span class="o"&gt;=&lt;/span&gt; 1&lt;span class="p"&gt;;&lt;/span&gt;
                      |   long    |  &lt;span class="nt"&gt;-9&lt;/span&gt;.223.372.036.854.770.000  |   9.223.372.036.854.770.000  |      0       |   64 bits | long l &lt;span class="o"&gt;=&lt;/span&gt; 1l&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------|------------------------------|--------------|-----------|------------------------------------
Ponto Flutuante       |   float   |           &lt;span class="nt"&gt;-1&lt;/span&gt;,4024E-37        |         3.40282347E+38       |      0       |   32 bits | float f &lt;span class="o"&gt;=&lt;/span&gt; 1.1f&lt;span class="p"&gt;;&lt;/span&gt;
                      |   double  |           &lt;span class="nt"&gt;-4&lt;/span&gt;,94E-307         |   1.79769313486231570E+308   |      0       |   64 bits | double d &lt;span class="o"&gt;=&lt;/span&gt; 1.1&lt;span class="p"&gt;;&lt;/span&gt; ou double d &lt;span class="o"&gt;=&lt;/span&gt; 1.1d&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------|------------------------------|--------------|-----------|------------------------------------
Caractere             |   char    |               0              |            65535             |     &lt;span class="se"&gt;\0&lt;/span&gt;       |   16bits  | char c &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; ou char c &lt;span class="o"&gt;=&lt;/span&gt; 194&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------|------------------------------|--------------|-----------|------------------------------------
Booleano              |   boolean |             &lt;span class="nb"&gt;false&lt;/span&gt;            |             &lt;span class="nb"&gt;true&lt;/span&gt;             |    &lt;span class="nb"&gt;false&lt;/span&gt;     |   1 bit   | boolean b &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------|------------------------------|--------------|-----------|------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tipos não primitivos
&lt;/h2&gt;

&lt;p&gt;Os tipos não primitivos são as classes e com isso é possível usar o paradigma de orientação a objetos, como herança, sobrecarga, sobrescrita e encapsulamento.&lt;br&gt;
O &lt;strong&gt;Java&lt;/strong&gt; possui várias classes que podemos usar e no exemplo abaixo iremos ver a classe &lt;strong&gt;String&lt;/strong&gt; que representa um conjunto de caractéres e é usado para textos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá Mundo"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como se trata de uma classe quando criamos uma variável do tipo &lt;strong&gt;String&lt;/strong&gt; é criado um objeto e ganhamos ações (métodos) que podemos usar para trabalhar com textos, exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá Mundo"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E se executarmos esse código a saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;OLÁ MUNDO
olá mundo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Foi usado o método &lt;em&gt;println(string)&lt;/em&gt; da classe &lt;strong&gt;System&lt;/strong&gt; que é método usado para exibir (printar) um texto no console.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operadores aritméticos
&lt;/h2&gt;

&lt;p&gt;Operadores aritméticos são usados quando é necessário executar operações matemáticas com variáveis e valores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------------|---------------------------------
Operação              | Operador  | Exemplo                            | Descrição                       
&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------------|---------------------------------
Adição                |     +     |             x + y                  | Adição de valores               
Subtração             |     -     |             x - y                  | Subtração de valores            
Multiplicação         |     &lt;span class="k"&gt;*&lt;/span&gt;     |             x &lt;span class="k"&gt;*&lt;/span&gt; y                  | Multiplicação de valores        
Divisão               |     /     |             x / y                  | Divisão de valores              
Módulo                |     %     |             x % y                  | Retorna o resto de uma divisão  
Incremento            |    ++     |           x++ ou ++x               | Incrementa o valor em 1         
Decremento            |    __     |           x-- ou &lt;span class="nt"&gt;--x&lt;/span&gt;               | Decrementa o valor em 1         
&lt;span class="nt"&gt;-----------------&lt;/span&gt;|-----------|------------------------------------|---------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Operador de atribuição
&lt;/h2&gt;

&lt;p&gt;Nos exemplos anteriores já foi usado o operador de atribuição e como o próprio nome já diz ele é um operador usado para atribuir algum valor, o operador mais comum de atribuição é o &lt;strong&gt;=&lt;/strong&gt; (igual) onde uma variável recebe um valor mas existem outros operadores e iremos ver os mais usados;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-----&lt;/span&gt;|---------------------|------------------------------------------------------------------------------
Operador  | Exemplo             | Descrição          
&lt;span class="nt"&gt;-----&lt;/span&gt;|---------------------|------------------------------------------------------------------------------
&lt;span class="o"&gt;=&lt;/span&gt;         |  x &lt;span class="o"&gt;=&lt;/span&gt; 5              | Atribui o valor 5 para variável x
+&lt;span class="o"&gt;=&lt;/span&gt;        |  x+&lt;span class="o"&gt;=&lt;/span&gt; 5 ou x &lt;span class="o"&gt;=&lt;/span&gt; x + 5 | Adiciona o valor 5 para a variável x             
-&lt;span class="o"&gt;=&lt;/span&gt;        |  x-&lt;span class="o"&gt;=&lt;/span&gt; 5 ou x &lt;span class="o"&gt;=&lt;/span&gt; x - 5 | Subtrai o valor 5 para a variável x
&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;        |  x&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; 5 ou x &lt;span class="o"&gt;=&lt;/span&gt; x &lt;span class="k"&gt;*&lt;/span&gt; 5 | Multiplica o valor de x em 5 vezes              
/&lt;span class="o"&gt;=&lt;/span&gt;        |  x/&lt;span class="o"&gt;=&lt;/span&gt; 5 ou x &lt;span class="o"&gt;=&lt;/span&gt; x / 5 | Divide o valor de x pelo número 5 e guarda o resultado na variável x   
%&lt;span class="o"&gt;=&lt;/span&gt;        |  x%&lt;span class="o"&gt;=&lt;/span&gt; 5 ou x &lt;span class="o"&gt;=&lt;/span&gt; x % 5 | Divide o valor de x pelo número 5 e guarda o resto da divisão na variável x             
&lt;span class="nt"&gt;-----&lt;/span&gt;|---------------------|------------------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um adendo aqui é que a temos o que é chamado de açúcar sintáxico em alguns operadores onde podemos escrever de forma mais resumida a expressão, onde &lt;strong&gt;x+= 5&lt;/strong&gt; tem o mesmo resultado que &lt;strong&gt;x = x + 5&lt;/strong&gt;, as duas expressões fazem a mesma coisa mas a primeira é mais sucinta de escrever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operadores de comparação
&lt;/h2&gt;

&lt;p&gt;Os operadores de comparação são utilizados para comparar valores e são muito usados em &lt;strong&gt;condicionais&lt;/strong&gt; que serão mostradas mais adiante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-----&lt;/span&gt;|----------------|----------|------------------------------------------------------------
Operador  | Nome           | Exemplo  | Descrição          
&lt;span class="nt"&gt;-----&lt;/span&gt;|----------------|----------|------------------------------------------------------------
&lt;span class="o"&gt;==&lt;/span&gt;        | Igualdade      |  x &lt;span class="o"&gt;==&lt;/span&gt; y  | Compara se o valor de x é igual ao valor de y
&lt;span class="o"&gt;!=&lt;/span&gt;        | Não igualdade  |  x &lt;span class="o"&gt;!=&lt;/span&gt; y  | Operador usado para afirmar que dois valores não são iguais
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;         | Maior que      |  x &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; y   | Compara se o valor de x é maior que o valor de y
&amp;lt;         | Menor que      |  x &amp;lt; y   | Compara se o valor de x é menor que o valor de y
&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;        | Maior igual    |  x &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; y  | Compara se o valor de x é maior ou igual que o valor de y
&amp;lt;&lt;span class="o"&gt;=&lt;/span&gt;        | Menor igual    |  x &amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; y  | Compara se o valor de x é menor ou igual que o valor de y
&lt;span class="nt"&gt;-----&lt;/span&gt;|----------------|----------|------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existem outros operadores, porém foram demonstrados os mais usados no dia-a-dia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operadores Lógicos
&lt;/h2&gt;

&lt;p&gt;Antes de entender os operadores lógicos vale a pena comentar sobre a tabela verdade, que é um dispositivo utilizado no estudo da lógica matemática. Com o uso desta tabela é possível definir o valor lógico de uma proposição, isto é, saber quando uma sentença é verdadeira ou falsa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-----&lt;/span&gt;|----------------|-----------------|--------------------------------------------------------------------
Conectivo | Símbolo        | Operação lógica | Valor lógico          
&lt;span class="nt"&gt;-----&lt;/span&gt;|----------------|-----------------|--------------------------------------------------------------------
não       |       ~        |  negação        | Terá valor falso quando a proposição &lt;span class="k"&gt;for &lt;/span&gt;verdadeira ou vice-versa
e         |       ^        |  conjunção      | Será verdadeira quando todas as proposições forem verdadeiras
ou        |       v        |  disjunção      | Será verdadeira se pelo menos uma das proposições &lt;span class="k"&gt;for &lt;/span&gt;verdadeira
&lt;span class="nt"&gt;-----&lt;/span&gt;|----------------|-----------------|--------------------------------------------------------------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para ilustrar melhor vamos ao seguinte exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A seguinte expressão pode ser lida: O número 1 é menor do que 2 &lt;strong&gt;E&lt;/strong&gt; o número 2 é maior do que 1 o que torna essa expressão como &lt;strong&gt;VERDADEIRA&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Uma forma de simplificar a tabela verdade seria desse modo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--&lt;/span&gt;|---|-----|---------     &lt;span class="nt"&gt;---&lt;/span&gt;|-----
p | q | p^q | p v q         p | ~p
&lt;span class="nt"&gt;--&lt;/span&gt;|---|-----|---------     &lt;span class="nt"&gt;---&lt;/span&gt;|----
V | V |  V  |   V           V |  F
V | F |  F  |   V           F |  V
F | V |  F  |   V
F | F |  F  |   F
&lt;span class="nt"&gt;--&lt;/span&gt;|---|---------------
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora trazendo isso para a linguagem &lt;strong&gt;Java&lt;/strong&gt;, o que muda são os símbolos mas a lógica permanece a mesma e ao invés de termos o resultado dessas expressões como &lt;strong&gt;verdadeira&lt;/strong&gt; ou &lt;strong&gt;falsa&lt;/strong&gt; é usado &lt;strong&gt;true&lt;/strong&gt; ou &lt;strong&gt;false&lt;/strong&gt; e esse tipo de variável é do tipo &lt;strong&gt;boolean&lt;/strong&gt;, um adendo que vale ressaltar é que essa lógica se chama Lógica Booleana em homenagem a George Boole que introduziu o tema em 1847. &lt;/p&gt;

&lt;p&gt;Porém no &lt;strong&gt;Java&lt;/strong&gt; não são usados os símbolos &lt;strong&gt;~&lt;/strong&gt;, &lt;strong&gt;^&lt;/strong&gt;, &lt;strong&gt;v&lt;/strong&gt; para expressões booleanas, com exceção do operador &lt;strong&gt;^&lt;/strong&gt; que é usado para outro operador lógico que não veremos aqui mas que para fins de conhecimento é o XOR ou chamado de &lt;strong&gt;OU Exclusivo&lt;/strong&gt;; então para negação é usado o símbolo &lt;strong&gt;!&lt;/strong&gt; (exclamação), para conjunção é usado o símbolo &lt;strong&gt;&amp;amp;&lt;/strong&gt; (E comercial) e para disjunção é usado o simbolo &lt;strong&gt;|&lt;/strong&gt; (pipe) como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;verdadeiroConjuncao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;falsoConjuncao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;verdadeiroDisjuncao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;falsoDisjuncao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="n"&gt;negacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Começamos hoje uma série de artigos introdutórios ao &lt;strong&gt;Java&lt;/strong&gt;, foi passado um pouco da história e conceitos básicos da linguagem no próximo artigo será apresentado o tema &lt;strong&gt;condicionais e laços de repetição&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>java</category>
    </item>
    <item>
      <title>Kafka Sink</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Mon, 21 Jun 2021 03:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/kafka-sink-4p3n</link>
      <guid>https://dev.to/guilhermegarcia86/kafka-sink-4p3n</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;No último &lt;a href="https://programadev.com.br/kafka-connector/" rel="noopener noreferrer"&gt;artigo&lt;/a&gt; foi mostrado como é possível a partir de uma fonte de dados externa, alimentar um tópico do &lt;strong&gt;Kafka&lt;/strong&gt; através do &lt;strong&gt;Kafka Source&lt;/strong&gt;. Agora será visto como podemos fazer a operação inversa onde as informações de um tópico alimentarão uma fonte de dados externa através do &lt;strong&gt;Kafka Sink&lt;/strong&gt;, nesse exemplo será usado o banco de dados não relacional &lt;strong&gt;MongoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kafka Sink
&lt;/h2&gt;

&lt;p&gt;Como foi visto no artigo passado o &lt;strong&gt;Kafka Source&lt;/strong&gt; é uma ferramenta &lt;em&gt;open source&lt;/em&gt; criado pela &lt;strong&gt;Apache&lt;/strong&gt;, essa ferramenta facilita a comunicação em sistemas externos ao &lt;strong&gt;Kafka&lt;/strong&gt;, com isso conseguimos trazer dados de fontes externas e o oposto também pode ocorrer graças ao &lt;strong&gt;Kafka Sink&lt;/strong&gt;, que realiza essa operação de &lt;em&gt;sink&lt;/em&gt; (escoar) para sistemas externos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Mountaineer
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Data Mountaineer&lt;/strong&gt; é uma empresa com foco em BigData e streaming de dados que se juntou com a &lt;strong&gt;Landoop&lt;/strong&gt; e fornece o connector que se liga ao &lt;strong&gt;Kafka Connect&lt;/strong&gt; e realiza a operação de &lt;strong&gt;Sink&lt;/strong&gt; que nesse caso será com o &lt;strong&gt;MongoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projeto
&lt;/h2&gt;

&lt;p&gt;O projeto consistirá na configuração de um connector que irá receber mensagens de um tópico do &lt;strong&gt;Kafka&lt;/strong&gt; e irá salvar essas informações no &lt;strong&gt;MongoDB&lt;/strong&gt;, também será criado um projeto &lt;strong&gt;Java&lt;/strong&gt; que estará conectado ao banco de dados e irá expor via &lt;strong&gt;API REST&lt;/strong&gt; os dados para consulta.&lt;/p&gt;

&lt;p&gt;Focando na parte que será apresentada temos um desenho do fluxo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F9de042d8118b5a6862915f56b55c1775%2Fa6d36%2Fkafka-source-sink.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F9de042d8118b5a6862915f56b55c1775%2Fa6d36%2Fkafka-source-sink.png" alt="Imagem Fluxo De Dados MySQL para Mongo" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Onde podemos ver de forma resumida o fluxo de dados que começa com o banco de dados &lt;strong&gt;MySQL&lt;/strong&gt;, onde as alterações são capturadas pelo &lt;strong&gt;Debezium&lt;/strong&gt; e através do &lt;strong&gt;Kafka Connect&lt;/strong&gt; são enviadas ao broker do &lt;strong&gt;Kafka&lt;/strong&gt; e também via &lt;strong&gt;Kafka Connect&lt;/strong&gt; os dados são consumidos de um tópico e enviados ao &lt;strong&gt;Data Mountaineer&lt;/strong&gt; e serão inseridos no &lt;strong&gt;MongoDB&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adicionando o Mongo ao Docker Compose
&lt;/h2&gt;

&lt;p&gt;É necessário adicionar o &lt;strong&gt;MongoDB&lt;/strong&gt; ao docker-compose como abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;  &lt;span class="na"&gt;mongo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kafka-cluster&lt;/span&gt;    
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;27017:27017&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kafka-network&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Acessando o MongoDB
&lt;/h2&gt;

&lt;p&gt;Vamos acessar o &lt;strong&gt;MongoDB&lt;/strong&gt; via terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; mongo mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E vamos acessar a collection &lt;strong&gt;taxpayer&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use taxpayer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurando Kafka Sink
&lt;/h2&gt;

&lt;p&gt;Para configurar o &lt;strong&gt;Kafka Sink&lt;/strong&gt; basta acessar novamente o dashboard, através da imagem &lt;em&gt;landoop/kafka-lenses-dev&lt;/em&gt; e clicar em &lt;strong&gt;Connectors&lt;/strong&gt; no lado esquerdo e depois no botão &lt;strong&gt;New Connector&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F3a6ced4dd368370f42f1f40fb0523075%2Fa6d36%2Fnew-connector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F3a6ced4dd368370f42f1f40fb0523075%2Fa6d36%2Fnew-connector.png" alt="Imagem Dashboard Novo Connector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Será exibida a tela com os conectores disponíveis e entre eles o conector do &lt;strong&gt;MongoDB&lt;/strong&gt; basta clicar nele que será aberta a tela para inserir as configurações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2Fc2781b44b4872c713de52169faedb571%2Fa6d36%2Fmongo-sink.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2Fc2781b44b4872c713de52169faedb571%2Fa6d36%2Fmongo-sink.png" alt="Imagem Dashboard Mongo Connector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nessa tela iremos inserir as seguintes configurações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;connector.class&lt;span class="o"&gt;=&lt;/span&gt;com.datamountaineer.streamreactor.connect.mongodb.sink.MongoSinkConnector
connect.mongo.kcql&lt;span class="o"&gt;=&lt;/span&gt;UPSERT INTO taxpayer SELECT after FROM irs-conn.decider.complaint_taxpayer PK after.document&lt;span class="p"&gt;;&lt;/span&gt;UPSERT INTO taxpayer SELECT after FROM irs-conn.decider.defaulted_taxpayer PK after.document
connect.mongo.connection&lt;span class="o"&gt;=&lt;/span&gt;mongodb://mongo:27017
tasks.max&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;span class="nv"&gt;topics&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;irs-conn.decider.complaint_taxpayer,irs-conn.decider.defaulted_taxpayer
&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mongo
connect.mongo.db&lt;span class="o"&gt;=&lt;/span&gt;taxpayer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos bater ponto a ponto essa configuração:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;name&lt;/em&gt;: Nome da conexão.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;connector.class&lt;/em&gt;: É a classe que é carregada para fazer a conexão com o &lt;strong&gt;MongoDB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;connect.mongo.connection&lt;/em&gt;: URI de conexão com o banco de dados.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;connect.mongo.db&lt;/em&gt;: Nome da collection no Mongo.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;tasks.max&lt;/em&gt; Máximo de tasks para essa conexão.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;topics&lt;/em&gt;: Aqui deve ser informado quais são os tópicos que serão "escutados" pelo &lt;strong&gt;Kafka Connect&lt;/strong&gt; para delegar ao &lt;strong&gt;Data Mountaineer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;connect.mongo.kcql&lt;/em&gt;: &lt;strong&gt;KCQL&lt;/strong&gt; é como diz &lt;a href="https://docs.lenses.io/2.1/lenses-sql/kcql.html" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;, &lt;strong&gt;SQL for Kafka Connect&lt;/strong&gt;, não é algo incomum a própria &lt;strong&gt;Confluent&lt;/strong&gt; possui algo similar que é o &lt;strong&gt;kSQL&lt;/strong&gt; que nada mais é do que uma forma de simplificar a manipulação de dados e streams através de queries &lt;strong&gt;SQL&lt;/strong&gt;. Como no nosso exemplo iremos capturar dados de dois tópicos precisamos criar duas &lt;em&gt;queries&lt;/em&gt; para fazer &lt;strong&gt;UPSERT&lt;/strong&gt; no &lt;strong&gt;MongoDB&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após clicar em &lt;strong&gt;Create Connector&lt;/strong&gt; a nova conexão deve ser listada como mostrado abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F68f1a7b59db7a80c9e2162e047db7136%2Fa6d36%2Fmongo-config.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fstatic%2F68f1a7b59db7a80c9e2162e047db7136%2Fa6d36%2Fmongo-config.png" alt="Imagem Dashboard Connector Criado" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitorando o MongoDB
&lt;/h2&gt;

&lt;p&gt;Agora podemos realizar alterações no &lt;strong&gt;MySQL&lt;/strong&gt; e elas serão enviadas para os tópicos correspondentes e serão capturadas pelo &lt;strong&gt;Kafka Sink&lt;/strong&gt; e enviadas ao &lt;strong&gt;MongoDB&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; db.taxpayer.find&lt;span class="o"&gt;()&lt;/span&gt;.pretty&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"_id"&lt;/span&gt; : &lt;span class="s2"&gt;"890.955.180-19"&lt;/span&gt;,
        &lt;span class="s2"&gt;"after"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"document"&lt;/span&gt; : &lt;span class="s2"&gt;"890.955.180-19"&lt;/span&gt;,
                &lt;span class="s2"&gt;"email"&lt;/span&gt; : &lt;span class="s2"&gt;"teste@teste.com"&lt;/span&gt;,
                &lt;span class="s2"&gt;"name"&lt;/span&gt; : &lt;span class="s2"&gt;"Sandra Nair Sueli Ribeiro"&lt;/span&gt;,
                &lt;span class="s2"&gt;"status"&lt;/span&gt; : &lt;span class="s2"&gt;"DEFAULTED"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"_id"&lt;/span&gt; : &lt;span class="s2"&gt;"869.097.474-10"&lt;/span&gt;,
        &lt;span class="s2"&gt;"after"&lt;/span&gt; : &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;"document"&lt;/span&gt; : &lt;span class="s2"&gt;"869.097.474-10"&lt;/span&gt;,
                &lt;span class="s2"&gt;"email"&lt;/span&gt; : &lt;span class="s2"&gt;"fake@fake.com.br"&lt;/span&gt;,
                &lt;span class="s2"&gt;"name"&lt;/span&gt; : &lt;span class="s2"&gt;"Joao Alface"&lt;/span&gt;,
                &lt;span class="s2"&gt;"status"&lt;/span&gt; : &lt;span class="s2"&gt;"COMPLAINT"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Projeto Java
&lt;/h2&gt;

&lt;p&gt;Para iniciar o projeto foi utilizado o &lt;strong&gt;Spring Initializr&lt;/strong&gt; onde foi adicionado as dependências de &lt;strong&gt;Web&lt;/strong&gt;, &lt;strong&gt;Lombok&lt;/strong&gt; e &lt;strong&gt;Spring Data Mongo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Iniciando pelo domínio dessa aplicação temos a &lt;strong&gt;Taxpayer&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@Builder&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Taxpayer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nos casos de uso dessa aplicação queremos que seja possível buscar os &lt;strong&gt;Taxpayers&lt;/strong&gt; pelo número de documento, email e listar todos. Para isso foi criado a classe &lt;strong&gt;SearchTaxpayer&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SearchTaxpayer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;TaxpayerRepository&lt;/span&gt; &lt;span class="n"&gt;taxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SearchTaxpayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerRepository&lt;/span&gt; &lt;span class="n"&gt;taxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taxpayerRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Taxpayer&lt;/span&gt; &lt;span class="nf"&gt;searchByEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findByEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;optionalTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;TaxpayerNotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Taxpayer not found"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Taxpayer&lt;/span&gt; &lt;span class="nf"&gt;searchByDocument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findByDocument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;optionalTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;TaxpayerNotFoundException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Taxpayer not found"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;taxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para ela funcionar é necessário criar a classe &lt;strong&gt;TaxpayerRepository&lt;/strong&gt; que nada mais é que a interface que servirá como &lt;em&gt;port&lt;/em&gt; no conceito de &lt;em&gt;ports and adapters&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;TaxpayerRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByDocument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora criamos o nosso &lt;strong&gt;Adapter&lt;/strong&gt; para ele, mas primeiro faremos as configurações que o &lt;strong&gt;MongoDB&lt;/strong&gt; necessita, primeiro criando a nossa entidade de banco de dados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="nd"&gt;@Document&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"taxpayer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;After&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;After&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como estamos usando &lt;strong&gt;Spring Data&lt;/strong&gt; o trabalho é muito simplificado bastando criar uma interface que estenda de &lt;strong&gt;MongoRepository&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;MongoTaxpayerRepository&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;MongoRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByAfter_Email&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByAfter_Document&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora criamos o &lt;strong&gt;Adapter&lt;/strong&gt; implementando a &lt;strong&gt;TaxpayerRepository&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MongoTaxpayer&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;TaxpayerRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;MongoTaxpayerRepository&lt;/span&gt; &lt;span class="n"&gt;mongoTaxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;MongoTaxpayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MongoTaxpayerRepository&lt;/span&gt; &lt;span class="n"&gt;mongoTaxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mongoTaxpayerRepository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mongoTaxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayerEntity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mongoTaxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findByAfter_Email&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;optionalTaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;After&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAfter&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;document&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDocument&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStatus&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findByDocument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayerEntity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mongoTaxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findByAfter_Document&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;optionalTaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isPresent&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;After&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;optionalTaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getAfter&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;document&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDocument&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStatus&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;taxpayerEntityList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mongoTaxpayerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;taxpayerEntityList&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;taxpayerEntityList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;taxpayerList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taxpayerEntityList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taxpayerEntity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;After&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;taxpayerEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAfter&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;document&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDocument&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getEmail&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getStatus&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}).&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Optional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taxpayerList&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o adaptador criado vamos criar o controller que irá receber as requisições &lt;strong&gt;REST&lt;/strong&gt; e delegar para a classe &lt;strong&gt;SearchTaxpayer&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/taxpayer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TaxpayerController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;SearchTaxpayer&lt;/span&gt; &lt;span class="n"&gt;searchTaxpayer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getAllTaxpayers&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"document"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getTaxpayerByDocument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"document"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;searchByDocument&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@GetMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Taxpayer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getTaxpayerByEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@RequestParam&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;searchTaxpayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;searchByEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após subir a aplicação e fazendo uma requisição para url&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 teremos como resultado:



```json
[
    {
        "document": "890.955.180-19",
        "email": "teste@teste.com",
        "name": "Sandra Nair Sueli Ribeiro",
        "status": "DEFAULTED"
    },
    {
        "document": "1234567890",
        "email": "fake@fake.com.br",
        "name": "Joao Alface",
        "status": "COMPLAINT"
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Aqui vimos a outra ponta do &lt;strong&gt;Kafka Connect&lt;/strong&gt;, o &lt;strong&gt;Kafka Sink&lt;/strong&gt; e foi apresentado um exemplo prático de como podemos ter bases ou até mesmo aplicações que podem receber dados através de streams com as ferramentas que o &lt;strong&gt;Kafka&lt;/strong&gt; disponibiliza.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código fonte
&lt;/h2&gt;

&lt;p&gt;O código do projeto está no &lt;a href="https://github.com/guilhermegarcia86/kafka-series/tree/kafka-sink" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>sink</category>
      <category>database</category>
    </item>
    <item>
      <title>Kafka Connector</title>
      <dc:creator>guilhermegarcia86</dc:creator>
      <pubDate>Mon, 21 Jun 2021 03:00:01 +0000</pubDate>
      <link>https://dev.to/guilhermegarcia86/kafka-connector-1nmd</link>
      <guid>https://dev.to/guilhermegarcia86/kafka-connector-1nmd</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Continuando a sequência de artigos sobre &lt;strong&gt;Kafka&lt;/strong&gt; agora vamos entender o que é o &lt;strong&gt;Kafka Connect&lt;/strong&gt; e iremos criar um &lt;em&gt;listener&lt;/em&gt; que capturará mudanças no banco de dados e irá enviar para um tópico no &lt;strong&gt;Kafka&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kafka Connect
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Kafka Connect&lt;/strong&gt; é uma ferramenta &lt;em&gt;open source&lt;/em&gt; criada pela &lt;strong&gt;Apache&lt;/strong&gt; para poder se conectar com sistemas externos e lidar com volumes altíssimos de dados, podendo assim tanto receber quanto enviar dados para essas fontes. No artigo abaixo iremos explorar o &lt;strong&gt;Kafka Connect Source API&lt;/strong&gt; que faz a parte de ingestão de dados mas também há o &lt;strong&gt;Kafka Connect Sink API&lt;/strong&gt; que é o responsável por enviar dados de tópicos do Kafka para sistemas externos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debezium
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Debezium&lt;/strong&gt; é um &lt;strong&gt;CDC&lt;/strong&gt;, abreviação para &lt;strong&gt;Change Data Capture&lt;/strong&gt;, isso significa que ele é uma peça que fica conectada ao &lt;strong&gt;Kafka Connect&lt;/strong&gt; e tem a responsabilidade de capturar alterações no banco de dados. Ele possui vários conectores para bancos de dados como &lt;strong&gt;SQL Server&lt;/strong&gt;, &lt;strong&gt;Oracle&lt;/strong&gt;, &lt;strong&gt;PostgreSQL&lt;/strong&gt;, &lt;strong&gt;MongoDB&lt;/strong&gt; e etc. nesse artigo será usado o connector para &lt;strong&gt;MySQL&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Projeto
&lt;/h2&gt;

&lt;p&gt;Para começar vamos analisar o esboço arquitetural abaixo e entender o que está sendo proposto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F2ffc31be90c324f518f60f246db79043%2Fa6d36%2Fdiagrama-kafka-debezium.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F2ffc31be90c324f518f60f246db79043%2Fa6d36%2Fdiagrama-kafka-debezium.png" alt="Imagem Diagrama Debezium" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em comparação com os desenhos dos artigos anteriores o ponto que mudou foi na aplicação &lt;strong&gt;Decider&lt;/strong&gt; que possui um banco de dados &lt;strong&gt;MySQL&lt;/strong&gt; e nele está conectado o &lt;strong&gt;Debezium&lt;/strong&gt; e este está conectado ao &lt;strong&gt;Kafka Connect&lt;/strong&gt; que por sua vez está conectado ao broker do &lt;strong&gt;Kafka&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Primeiramente olhando para o desenho do banco de dados conseguimos ver que existe o &lt;strong&gt;Binlog&lt;/strong&gt; se conectando ao &lt;strong&gt;Debezium&lt;/strong&gt;, isso por que o &lt;strong&gt;Debezium&lt;/strong&gt; se conecta ao &lt;strong&gt;Binlog&lt;/strong&gt; e através dele consegue ficar "escutando" todas as transações que ocorrem no banco. &lt;/p&gt;

&lt;p&gt;Mas o que é esse &lt;strong&gt;Binlog&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Binlog&lt;/strong&gt; é a abreviação para &lt;strong&gt;Binary Logs&lt;/strong&gt; que é a forma como os bancos de dados tem para guardar os eventos que ocorreram neles, ele guarda muitas métricas como por exemplo quanto tempo uma &lt;em&gt;query&lt;/em&gt; demorou para ser executada, quais dados foram criados, alterados, deletados e etc.&lt;/p&gt;

&lt;p&gt;Após receber a informação do &lt;strong&gt;Binlog&lt;/strong&gt; o &lt;strong&gt;Debezium&lt;/strong&gt; delega ao &lt;strong&gt;Kafka Connect&lt;/strong&gt; que é quem realmente se conecta ao broker do &lt;strong&gt;Kafka&lt;/strong&gt; e cria ou insere em um tópico já existente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando o ambiente
&lt;/h2&gt;

&lt;p&gt;Nos artigos anteriores estava usando a imagem &lt;em&gt;landdop/fast-data-dev&lt;/em&gt; pois ela já fornecia todo o ambiente do &lt;strong&gt;Kafka&lt;/strong&gt; pronto para o desenvolvimento porém durante os testes com o &lt;strong&gt;Kafka Connect&lt;/strong&gt; ela estava apresentando problemas com os conectores do &lt;strong&gt;Debezium&lt;/strong&gt; e após pesquisar soluções e alternativas encontrei uma nova imagem &lt;em&gt;landoop/kafka-lenses-dev&lt;/em&gt;, porém para executar essa imagem é necessário criar uma licença na &lt;a href="https://lenses.io/box/" rel="noopener noreferrer"&gt;Lenses&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Após receber a licença basta adicionar como variável de ambiente e acessar &lt;a href="https://dev.tolocalhost:3030"&gt;localhost:3030&lt;/a&gt; com usuário e senha &lt;em&gt;admin&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Como estou usando &lt;strong&gt;Docker Compose&lt;/strong&gt; o &lt;em&gt;.yml&lt;/em&gt; fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0.17&lt;/span&gt;
    &lt;span class="na"&gt;cap_add&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;SYS_NICE&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;user&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;register&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kafka-network&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306:3306"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/decider.sql:/docker-entrypoint-initdb.d/decider.sql&lt;/span&gt;

  &lt;span class="na"&gt;kafka-cluster&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;landoop/kafka-lenses-dev&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;EULA&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://licenses.lenses.io/download/lensesdl?id=idLicenseLenses"&lt;/span&gt; 
      &lt;span class="na"&gt;CONNECT_HEAP&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3G&lt;/span&gt;
      &lt;span class="na"&gt;ADV_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;127.0.0.1&lt;/span&gt;
      &lt;span class="na"&gt;SAMPLEDATA&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
      &lt;span class="na"&gt;RUNTESTS&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kafka-network&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2181:2181"&lt;/span&gt;                 &lt;span class="c1"&gt;# Zookeeper&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3030:3030"&lt;/span&gt;                 &lt;span class="c1"&gt;# Landoop UI&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8081-8083:8081-8083"&lt;/span&gt;       &lt;span class="c1"&gt;# REST Proxy, Schema Registry, Kafka Connect ports&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9581-9585:9581-9585"&lt;/span&gt;       &lt;span class="c1"&gt;# JMX Ports&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;9092:9092"&lt;/span&gt;                 &lt;span class="c1"&gt;# Kafka Broker&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kafka-network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
    &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bridge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Configurando Debezium
&lt;/h2&gt;

&lt;p&gt;Vamos iniciar a configuração do &lt;strong&gt;Debezium&lt;/strong&gt; no &lt;strong&gt;Kafka Connect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando acessar o dashboard na guia lateral clique em &lt;strong&gt;Connectors&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Fc9e425e4bb90afb06fdb27cf4b6eb79a%2Fa6d36%2Fdashboard-kafka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Fc9e425e4bb90afb06fdb27cf4b6eb79a%2Fa6d36%2Fdashboard-kafka.png" alt="Imagem Dashboard Connector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso clique em &lt;strong&gt;New Connector&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F3a6ced4dd368370f42f1f40fb0523075%2Fa6d36%2Fnew-connector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F3a6ced4dd368370f42f1f40fb0523075%2Fa6d36%2Fnew-connector.png" alt="Imagem Dashboard Novo Connector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No dashboard irá aparecer todos os conectores disponíveis (existem dois &lt;strong&gt;CDC MySQL&lt;/strong&gt; mas é por que um é o &lt;strong&gt;CDC SQL Server&lt;/strong&gt; que está com o nome errado):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F64cee8a410c226685b728ffa92fb91a6%2Fa6d36%2Fcdc-mysql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F64cee8a410c226685b728ffa92fb91a6%2Fa6d36%2Fcdc-mysql.png" alt="Imagem Dashboard Connector MySQL" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Irá aparecer o campo &lt;em&gt;text area&lt;/em&gt; para inserir as configurações e a aqui vale passar ponto a ponto as configurações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;IRS-Connector
connector.class&lt;span class="o"&gt;=&lt;/span&gt;io.debezium.connector.mysql.MySqlConnector
database.hostname&lt;span class="o"&gt;=&lt;/span&gt;mysql
database.port&lt;span class="o"&gt;=&lt;/span&gt;3306
database.user&lt;span class="o"&gt;=&lt;/span&gt;user
database.password&lt;span class="o"&gt;=&lt;/span&gt;user
database.allowPublicKeyRetrieval&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true
&lt;/span&gt;database.server.name&lt;span class="o"&gt;=&lt;/span&gt;irs-conn-v1
database.include.list&lt;span class="o"&gt;=&lt;/span&gt;decider
database.exclude.list&lt;span class="o"&gt;=&lt;/span&gt;register
database.blacklist&lt;span class="o"&gt;=&lt;/span&gt;register
database.history.kafka.bootstrap.servers&lt;span class="o"&gt;=&lt;/span&gt;localhost:9092
database.history.kafka.topic&lt;span class="o"&gt;=&lt;/span&gt;schema-changes.decider
table.exclude.list&lt;span class="o"&gt;=&lt;/span&gt;decider.flyway_schema_history,register.flyway_schema_history
table.blacklist&lt;span class="o"&gt;=&lt;/span&gt;decider.flyway_schema_history,register.flyway_schema_history
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;O campo &lt;em&gt;name&lt;/em&gt; é obrigatório e define o nome do conector.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;connector.class&lt;/em&gt; é obrigatório e é a definição de qual classe que será carregada para esse conector.&lt;/li&gt;
&lt;li&gt;Os campos &lt;em&gt;database.hostname&lt;/em&gt;, &lt;em&gt;database.port&lt;/em&gt;, &lt;em&gt;database.user&lt;/em&gt; e &lt;em&gt;database.password&lt;/em&gt; são obrigatórios e são os dados de conexão do banco de dados.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.allowPublicKeyRetrieval&lt;/em&gt; é opcional e eu adicionei para permitir o &lt;em&gt;client&lt;/em&gt; executar o request da &lt;em&gt;public key&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.server.name&lt;/em&gt; é obrigatório, pode ser qualquer nome mas será usado como prefixo para os tópicos que serão criados no &lt;strong&gt;Kafka&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.include.list&lt;/em&gt; é opcional e serve para informar qual &lt;em&gt;database&lt;/em&gt; deve ficar escutando as alterações, como nesse exemplo temos dois &lt;em&gt;databases&lt;/em&gt; adicionei qual queria.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.exclude.list&lt;/em&gt; é opcional e é o oposto do campo acima e eu adicionei o &lt;em&gt;database&lt;/em&gt; que eu não quero ficar observando as alterações.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.blacklist&lt;/em&gt; está depreciado pelo campo &lt;em&gt;database.exclude.list&lt;/em&gt; segundo a documentação do &lt;strong&gt;Debezium&lt;/strong&gt;, mas não sei se por questão de versão ou bug o campo &lt;em&gt;database.exclude.list&lt;/em&gt; não estava funcionando; mas ele é exatamente a mesma ideia de excluir um database específico.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.history.kafka.bootstrap.servers&lt;/em&gt; é obrigatório e basicamente é o &lt;em&gt;host/port&lt;/em&gt; do cluster do &lt;strong&gt;Kafka&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;database.history.kafka.topic&lt;/em&gt; é obrigatório e serve para nomear o tópico no &lt;strong&gt;Kafka&lt;/strong&gt; onde o conector guarda o histórico de &lt;em&gt;schemas&lt;/em&gt; do &lt;em&gt;database&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;table.exclude.list&lt;/em&gt; é opcional e indica uma tabela que não deve ter as suas alterações observadas, deve estar no formato &lt;em&gt;nome do database&lt;/em&gt; + &lt;em&gt;nome da tabela&lt;/em&gt;, nesse caso como o projeto utiliza &lt;strong&gt;Flyway&lt;/strong&gt; para gerenciamento das versões do banco de dados eu o adicionei.&lt;/li&gt;
&lt;li&gt;O campo &lt;em&gt;table.blacklist&lt;/em&gt; também está depreciado porém como ocorreu com o campo &lt;em&gt;database.exclude.list&lt;/em&gt; não estava funcionando.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após adicionar as configurações basta clicar em &lt;strong&gt;Create Connector&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Fc2a785df86c8b83f1e58278e34d05bd8%2Fa6d36%2Fconfigure-connector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Fc2a785df86c8b83f1e58278e34d05bd8%2Fa6d36%2Fconfigure-connector.png" alt="Imagem Criar Connector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obs: Esse comando também pode ser feito via &lt;em&gt;cURL&lt;/em&gt; pois ele é executado via &lt;strong&gt;Kafka REST&lt;/strong&gt; e ficaria dessa foram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; &amp;gt; IRS-Connector.json
{
  "name": "IRS-Connector",
  "config": {
    "connector.class": "io.debezium.connector.mysql.MySqlConnector",
    "database.hostname": "mysql",
    "database.port": "3306",
    "database.user": "user",
    "database.password": "user",
    "database.allowPublicKeyRetrieval": "true",
    "database.server.name": "irs-conn-v1",
    "database.include.list": "decider",
    "database.exclude.list": "register",
    "database.blacklist": "register",
    "database.history.kafka.bootstrap.servers": "localhost:9092",
    "database.history.kafka.topic": "schema-changes.decider",
    "table.exclude.list": "decider.flyway_schema_history,register.flyway_schema_history",
    "table.blacklist": "decider.flyway_schema_history,register.flyway_schema_history"
  }
}
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; @IRS-Connector.json http://localhost:3030/api/proxy-connect/dev/connectors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo estiver certo deverá aparecer a tela de status com o conector rodando:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F8a025f59ad2bae9413d3641663bd0ef9%2Fa6d36%2Fstatus-connector.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F8a025f59ad2bae9413d3641663bd0ef9%2Fa6d36%2Fstatus-connector.png" alt="Imagem Status do Connector" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se clicarmos em &lt;strong&gt;Explore&lt;/strong&gt; na guia lateral iremos ver que foram criados os tópicos e também foram criados os &lt;em&gt;schemas&lt;/em&gt; no &lt;strong&gt;Schema Registry&lt;/strong&gt;:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F5b4d96c2ebf42b5d8eae4207964f2359%2Fa6d36%2Fkafka-topics.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F5b4d96c2ebf42b5d8eae4207964f2359%2Fa6d36%2Fkafka-topics.png" alt="Imagem Dashboard Tópicos" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Capturando mudanças no banco de dados
&lt;/h2&gt;

&lt;p&gt;Após todas essas configurações o conector está pronto e o &lt;strong&gt;Debezium&lt;/strong&gt; já está escutando as alterações, sendo assim se fizermos um &lt;strong&gt;INSERT&lt;/strong&gt; no banco &lt;strong&gt;Decider&lt;/strong&gt; ele irá capturar esse evento através do &lt;strong&gt;Binlog&lt;/strong&gt; e irá adicionar ao tópico do &lt;strong&gt;Kafka&lt;/strong&gt; como na imagem abaixo:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F6216500a9e92ad79814d19238308193c%2Fa6d36%2Finsert-topic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2F6216500a9e92ad79814d19238308193c%2Fa6d36%2Finsert-topic.png" alt="Imagem Dashboard Mensagem Recebida" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui conseguimos ver alguns detalhes, primeiro a &lt;em&gt;key&lt;/em&gt; passa a ser o &lt;em&gt;id&lt;/em&gt; da tabela no banco de dados e segundo que o nosso &lt;em&gt;value&lt;/em&gt; trás algumas informações mas o que chama mais a atenção é que ele consegue trazer o valor anterior e o valor atual que foi alterado, nesse exemplo como é um &lt;strong&gt;INSERT&lt;/strong&gt; o campo &lt;em&gt;before&lt;/em&gt; é nulo.&lt;/p&gt;

&lt;p&gt;Agora se atualizarmos o valor dessa linha na tabela:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Faf4bf32562e581223a54a12671b4086a%2Fa6d36%2Fupdate-table.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Faf4bf32562e581223a54a12671b4086a%2Fa6d36%2Fupdate-table.png" alt="Imagem Update Banco de Dados" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso gerará uma mensagem no tópico do &lt;strong&gt;Kafka&lt;/strong&gt; onde no campo &lt;em&gt;value&lt;/em&gt; poderá ser visto o valor do campo &lt;em&gt;before&lt;/em&gt; com os dados antes da atualização e no campo &lt;em&gt;after&lt;/em&gt; o valor atual daquela linha nesta tabela.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Fdc2433e13c3ed4c0e396aee999168688%2Fa6d36%2Fupdate-topic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprogramadev.com.br%2Fkafka-connector%2Fstatic%2Fdc2433e13c3ed4c0e396aee999168688%2Fa6d36%2Fupdate-topic.png" alt="Imagem Dashboard Mensagem Recebida Após Update" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com isso agora temos o conector em pleno funcionamento capturando qualquer alteração realizada nas tabelas que configuramos para monitorar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;No artigo foi apresentado como podemos usar um conector para "pegar" os dados em um banco de dados ou qualquer sistema externo e trazer para um tópico no &lt;strong&gt;Kafka&lt;/strong&gt;; o oposto também pode ser feito que é capturar dados em um tópico e inserir em um sistema externo, essa é a responsabilidade do &lt;strong&gt;Connector Sink API&lt;/strong&gt; e aqui deixo o &lt;a href="https://debezium.io/blog/2017/09/25/streaming-to-another-database/" rel="noopener noreferrer"&gt;link&lt;/a&gt; para um exemplo onde é usado o &lt;strong&gt;Connector Sink API&lt;/strong&gt; para inserir dados em um banco de dados &lt;strong&gt;PostgreSQL&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código fonte
&lt;/h2&gt;

&lt;p&gt;Segue o código feito no &lt;a href="https://github.com/guilhermegarcia86/kafka-series/tree/debezium" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kafka</category>
      <category>connect</category>
      <category>database</category>
    </item>
  </channel>
</rss>
