<?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: Herlon Costa</title>
    <description>The latest articles on DEV Community by Herlon Costa (@herlon_costa).</description>
    <link>https://dev.to/herlon_costa</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%2F1704004%2F15378307-7bc2-4f3e-bed8-e03f4e55494b.jpg</url>
      <title>DEV Community: Herlon Costa</title>
      <link>https://dev.to/herlon_costa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/herlon_costa"/>
    <language>en</language>
    <item>
      <title>Por que criptografar senhas é fundamental no desenvolvimento de software?</title>
      <dc:creator>Herlon Costa</dc:creator>
      <pubDate>Sat, 30 Aug 2025 12:45:11 +0000</pubDate>
      <link>https://dev.to/herlon_costa/por-que-criptografar-senhas-e-fundamental-no-desenvolvimento-de-software-5b97</link>
      <guid>https://dev.to/herlon_costa/por-que-criptografar-senhas-e-fundamental-no-desenvolvimento-de-software-5b97</guid>
      <description>&lt;p&gt;Se você está iniciando sua jornada no mundo do desenvolvimento de software, provavelmente já ouviu falar em &lt;em&gt;backend&lt;/em&gt;, &lt;em&gt;autenticação&lt;/em&gt; e &lt;em&gt;senhas&lt;/em&gt;. Mas será que você sabe &lt;strong&gt;como armazenar senhas de forma segura&lt;/strong&gt;? E por que isso é tão importante?&lt;/p&gt;

&lt;p&gt;Neste artigo, vamos explorar um dos pilares da segurança em aplicações: o &lt;strong&gt;hashing de senhas&lt;/strong&gt;. Vamos entender por que &lt;strong&gt;nunca&lt;/strong&gt; devemos armazenar senhas em texto claro, e como ferramentas como &lt;strong&gt;bcrypt&lt;/strong&gt; e &lt;strong&gt;Argon2&lt;/strong&gt; nos ajudam a proteger os usuários — e sua reputação como desenvolvedor.&lt;/p&gt;




&lt;h3&gt;
  
  
  O erro mais comum: armazenar senhas em texto claro
&lt;/h3&gt;

&lt;p&gt;Imagine que você está criando um sistema de cadastro. Um usuário se registra com o e-mail &lt;code&gt;ana@email.com&lt;/code&gt; e a senha &lt;code&gt;senha123&lt;/code&gt;. O que você faz com essa senha?&lt;/p&gt;

&lt;p&gt;Se a resposta for:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Salvo direto no banco de dados como &lt;code&gt;senha123&lt;/code&gt;",  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;então você está cometendo um erro &lt;strong&gt;gravíssimo&lt;/strong&gt; — e potencialmente perigoso.&lt;/p&gt;

&lt;p&gt;Armazenar senhas em &lt;strong&gt;texto claro&lt;/strong&gt; é como deixar a chave da sua casa debaixo do tapete. Se alguém invadir seu banco de dados (e isso acontece mais do que você imagina), terá acesso direto a todas as contas dos seus usuários.&lt;/p&gt;

&lt;p&gt;E não estamos falando de cenários hipotéticos.&lt;/p&gt;




&lt;h3&gt;
  
  
  A solução: hashing de senhas
&lt;/h3&gt;

&lt;p&gt;Para proteger as senhas, usamos uma técnica chamada &lt;strong&gt;hashing&lt;/strong&gt;. Um &lt;em&gt;hash&lt;/em&gt; é como uma "impressão digital" única de um dado. Ele transforma uma senha como &lt;code&gt;senha123&lt;/code&gt; em algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$argon2id$v=19$m=196608,t=2,p=1$c...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse valor é &lt;strong&gt;irreversível&lt;/strong&gt; — ou seja, mesmo que um atacante tenha o hash, &lt;strong&gt;não pode recuperar a senha original&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Mas não basta usar qualquer função de hash. Funções como &lt;strong&gt;MD5&lt;/strong&gt; ou &lt;strong&gt;SHA-256&lt;/strong&gt; são rápidas demais — e isso as torna inseguras para senhas. Atacantes podem testar bilhões de combinações por segundo com GPUs poderosas.&lt;/p&gt;

&lt;p&gt;É aí que entram ferramentas como &lt;strong&gt;bcrypt&lt;/strong&gt; e &lt;strong&gt;Argon2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ambos são algoritmos projetados para serem &lt;strong&gt;lentos de propósito&lt;/strong&gt; — isso dificulta ataques de força bruta. Mas há diferenças importantes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;bcrypt&lt;/th&gt;
&lt;th&gt;Argon2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Criado em 1999, amplamente usado&lt;/td&gt;
&lt;td&gt;Vencedor do &lt;em&gt;Password Hashing Competition&lt;/em&gt; em 2015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resistente a ataques comuns&lt;/td&gt;
&lt;td&gt;Mais resistente a ataques com GPU e hardware especializado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parâmetros: custo (número de iterações)&lt;/td&gt;
&lt;td&gt;Parâmetros: tempo, memória e threads (mais flexível)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seguro, mas mais antigo&lt;/td&gt;
&lt;td&gt;Estado da arte em segurança&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Por que isso importa para você, que está iniciando a jornada como desenvolvedor de software?
&lt;/h3&gt;

&lt;p&gt;Porque &lt;strong&gt;segurança é parte do nosso escopo de trabalho, nossa responsabilidade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você pode criar a interface mais bonita, a API mais rápida, mas se um vazamento de dados ocorrer por causa de senhas mal armazenadas, a &lt;strong&gt;culpa será sua&lt;/strong&gt; — e do seu código.&lt;/p&gt;

&lt;p&gt;Além disso, empresas hoje em dia exigem que desenvolvedores entendam de segurança básica. Saber como proteger dados sensíveis é um &lt;strong&gt;diferencial competitivo&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Deixo uma lista simples, mas direta, com práticas que todo iniciante deve seguir
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nunca armazene senhas em texto claro. Nunca.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Sempre use algoritmos lentos como &lt;strong&gt;bcrypt&lt;/strong&gt; ou &lt;strong&gt;Argon2&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Deixe o &lt;em&gt;salt&lt;/em&gt; (valor aleatório incrementado no processo de hashing) ser gerado automaticamente — essas bibliotecas fazem isso por você.&lt;/li&gt;
&lt;li&gt;Atualize os parâmetros periodicamente (ex: aumentar o custo do bcrypt conforme o hardware evolui).&lt;/li&gt;
&lt;li&gt;Teste seu código: verifique se o hash muda a cada nova senha, mesmo que seja igual.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Se você quiser se aprofundar um pouco mais no assunto, confira essas referências
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OWASP Password Storage Cheat Sheet&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   →&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html" rel="noopener noreferrer"&gt;https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;
   &lt;em&gt;O guia mais confiável sobre armazenamento seguro de senhas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NIST Digital Identity Guidelines (SP 800-63B)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   → &lt;a href="https://pages.nist.gov/800-63-3/sp800-63b.html" rel="noopener noreferrer"&gt;https://pages.nist.gov/800-63-3/sp800-63b.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;
   &lt;em&gt;Diretrizes oficiais dos EUA sobre autenticação e senhas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Password Hashing Competition (PHC)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   → &lt;a href="https://password-hashing.net" rel="noopener noreferrer"&gt;https://password-hashing.net&lt;/a&gt;&lt;br&gt;&lt;br&gt;
   &lt;em&gt;O concurso que escolheu o Argon2 como o futuro do hashing de senhas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentação do Argon2&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   → &lt;a href="https://github.com/ranisalt/node-argon2" rel="noopener noreferrer"&gt;https://github.com/ranisalt/node-argon2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentação do bcryptjs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   → &lt;a href="https://www.npmjs.com/package/bcryptjs" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/bcryptjs&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  E mantenha isso em mente:
&lt;/h3&gt;

&lt;p&gt;Começar na carreira de desenvolvimento é emocionante. Há tantas coisas para aprender, como frameworks, bancos de dados, APIs… Mas não subestime a importância da &lt;strong&gt;segurança desde o início do processo de planejamento de qualquer sistema&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Proteger senhas não é um "extra". É &lt;strong&gt;uma necessidade&lt;/strong&gt;. Um bom desenvolvedor &lt;strong&gt;escreve código que funciona.&lt;/strong&gt; Um ótimo desenvolvedor &lt;strong&gt;escreve código que é seguro.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E você pode — e deve — ser um ótimo desenvolvedor.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>security</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Como o JavaScript lida com operações assíncronas</title>
      <dc:creator>Herlon Costa</dc:creator>
      <pubDate>Sun, 10 Aug 2025 15:07:08 +0000</pubDate>
      <link>https://dev.to/herlon_costa/como-o-javascript-lida-com-operacoes-assincronas-bgm</link>
      <guid>https://dev.to/herlon_costa/como-o-javascript-lida-com-operacoes-assincronas-bgm</guid>
      <description>&lt;p&gt;O Node.js é conhecido por sua capacidade de lidar com operações assíncronas de forma eficiente, mesmo sendo single-threaded. O segredo por trás disso é o Event Loop, um mecanismo que gerencia a execução de callbacks e operações não-bloqueantes. Em vez de esperar uma tarefa ser concluída antes de passar para a próxima, o Node.js delega operações demoradas (como I/O de arquivos ou chamadas de rede) para o sistema operacional e continua processando outras tarefas. Quando a operação assíncrona termina, seu callback é colocado em uma fila e executado na fase apropriada do Event Loop.&lt;/p&gt;

&lt;p&gt;O Event Loop opera em fases bem definidas, como Timers (para setTimeout e setInterval), Poll (para I/O) e Check (para setImmediate). Além disso, existem as microtasks, como Promises e process.nextTick, que têm prioridade máxima e são executadas entre as fases principais. Isso explica por que um Promise.resolve().then(...) roda antes de um setTimeout(fn, 0), mesmo que ambos pareçam agendados para "imediatamente".&lt;/p&gt;

&lt;p&gt;Um erro comum é acreditar que funções assíncronas como fs.readFile ou setTimeout são executadas em paralelo. Na verdade, o Node.js usa apenas uma thread principal, mas delega operações bloqueantes para libuv (uma biblioteca em C que gerencia I/O assíncrono). Quando o sistema operacional sinaliza que a operação terminou, o callback é enfileirado. No entanto, se a thread principal estiver ocupada com um loop CPU-intensive (como um cálculo pesado), o Event Loop fica bloqueado — daí a importância de usar Worker Threads ou quebrar tarefas longas em partes menores.&lt;/p&gt;

&lt;p&gt;Dominar o Event Loop é essencial para escrever aplicações Node.js rápidas e escaláveis. Evitar callbacks aninhados (usando Promises/async-await), delegar operações custosas para threads separadas e entender a diferença entre setImmediate e process.nextTick são práticas que melhoram significativamente a performance. Em resumo, o Node.js não é mágico — ele apenas gerencia recursos de forma inteligente, e compreender seu funcionamento interno ajuda a evitar armadilhas comuns em sistemas de alta concorrência.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Você conhece os pilares da programação orientada a objetos?</title>
      <dc:creator>Herlon Costa</dc:creator>
      <pubDate>Mon, 30 Jun 2025 01:43:33 +0000</pubDate>
      <link>https://dev.to/herlon_costa/voce-conhece-os-pilares-da-programacao-orientada-a-objetos-m6m</link>
      <guid>https://dev.to/herlon_costa/voce-conhece-os-pilares-da-programacao-orientada-a-objetos-m6m</guid>
      <description>&lt;p&gt;A Orientação a Objetos (OOP) revolucionou o desenvolvimento de software ao permitir modelar sistemas como conjuntos de entidades interconectadas, espelhando o mundo real. Seus quatro pilares - Encapsulamento, Abstração, Herança e Polimorfismo - são a base para criar código modular, reutilizável e resiliente a mudanças. Neste artigo, iremos explorar cada pilar com exemplos práticos abordando cenários reais de software,utilizando a linguagem Java, mas que podem ser aplicados a outras linguagens que tenham suporte ao paradigma em questão.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Abstração&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Vamos começar pelo &lt;strong&gt;encapsulamento&lt;/strong&gt;. Essa é a etapa onde &lt;strong&gt;controlamos o acesso aos nossos dados&lt;/strong&gt;. A ideia é agrupar dados (atributos) e comportamentos (métodos) em uma unidade coesa (classe), restringindo o acesso direto ao estado interno desta.&lt;/p&gt;

&lt;p&gt;Para deixar mais claro, temos uma simulação de sistema bancário simples, onde temos uma conta, e o saldo desta conta não pode ser alterado livremente, precisamos então proteger esse dado de alguma forma. Vamos ver 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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContaBancaria&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;titular&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;double&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Atributo privado: acesso restrito&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;ContaBancaria&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;titular&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;saldoInicial&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;titular&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;titular&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="n"&gt;saldoInicial&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método público para depositar (com validação)&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;depositar&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;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="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;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="n"&gt;saldo&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="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;"Depósito realizado. Novo saldo: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;saldo&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;"Valor inválido!"&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="c1"&gt;// Método público para sacar (com validação)&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;sacar&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;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="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;saldo&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;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;"Saldo insuficiente ou valor inválido!"&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="c1"&gt;// Getter: acesso controlado ao saldo&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;getSaldo&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;saldo&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 saldo da conta só pode ser modificado com a utilização do método depositar() ou sacar(). E se por algum motivo a lógica mudar, como adicioanr uma taxa para cada operação, basta ajustarmos os métodos. Dessa forma, temos um código seguro e fácil de manter.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Encapsulamento&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Dito isso, passamos para o &lt;strong&gt;encapsulamento&lt;/strong&gt;, onde a ideia é focar apenas no essencial que um objeto faz, ocultando detalhes de implementação.&lt;/p&gt;

&lt;p&gt;Podemos pensar em um sistema de pagamentos, que precisa processar diferentes métodos (cartão, pix, boleto, etc...) sem se preocupar com os detalhes internos de cada um. Vamos ao 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="c1"&gt;// Interface define o contrato "processável"&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;MetodoPagamento&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;processarPagamento&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;valor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Implementação para Cartão&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;CartaoCredito&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;MetodoPagamento&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;processarPagamento&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;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;conectarGateway&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Detalhe interno oculto&lt;/span&gt;
        &lt;span class="n"&gt;validarLimite&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="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;"Pagamento com cartão: R$"&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;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;conectarGateway&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Implementação para Pix&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;Pix&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;MetodoPagamento&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;processarPagamento&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;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;gerarQRCode&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="c1"&gt;// Detalhe interno oculto&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;"Pagamento via Pix: R$"&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;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;gerarQRCode&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;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="cm"&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;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;Checkout&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;finalizarCompra&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MetodoPagamento&lt;/span&gt; &lt;span class="n"&gt;metodo&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;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;metodo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processarPagamento&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="c1"&gt;// Chama a implementação concreta&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;Checkout&lt;/span&gt; &lt;span class="n"&gt;checkout&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;Checkout&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;finalizarCompra&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;CartaoCredito&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="mf"&gt;150.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 
&lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;finalizarCompra&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;Pix&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="mf"&gt;200.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma conseguimos deixar o nosso código &lt;strong&gt;desacoplado e extensível&lt;/strong&gt;, o Checkout não sabe como o pagamento é processado, apenas que ele pode ser processado. E uma vez que precisarmos adicionar um novo método de pagamento, não precisamos realizar alterações no Checkout.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Herança&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;O terceiro pilar é a Herança. Esse conceito nos permite criar classes baseadas em classes existentes. Isso promove a reutilização, organização e manutenção do nosso código.&lt;/p&gt;

&lt;p&gt;Imagine que você está organizando uma garagem virtual e precisa catalogar diversos tipos de veículos. Em vez de criar classes completamente separadas para cada um, a herança permite modelar essa relação de forma mais eficiente.&lt;/p&gt;

&lt;p&gt;Pense em uma classe base (que chamamos de superclasse) chamada Veiculo. Todo veículo, independentemente do tipo, compartilha características comuns, certo? Ele tem uma marca, um modelo, um ano de fabricação. Ele também realiza ações básicas, como ligar e desligar.&lt;/p&gt;

&lt;p&gt;Agora, vamos aos veículos mais específicos. Temos carros, motos e caminhões. Todos eles são veículos, mas também possuem características e comportamentos próprios.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um Carro &lt;strong&gt;é um&lt;/strong&gt; Veiculo, mas também tem um número de portas.&lt;/li&gt;
&lt;li&gt;Uma Moto &lt;strong&gt;é um&lt;/strong&gt; Veiculo, mas tem um tipo de guidão.&lt;/li&gt;
&lt;li&gt;Um Caminhão &lt;strong&gt;é um&lt;/strong&gt; Veiculo, mas tem uma capacidade de carga.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos transformar isso em 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="c1"&gt;// Superclasse: Veiculo&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&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;marca&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;modelo&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;anoFabricacao&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;Veiculo&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;marca&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;modelo&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;anoFabricacao&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;marca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;marca&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;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modelo&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;anoFabricacao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anoFabricacao&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;ligar&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;modelo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" ligado."&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;desligar&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;modelo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" desligado."&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;exibirDetalhes&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;"Marca: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;marca&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;", Modelo: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;", Ano: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;anoFabricacao&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="c1"&gt;// Subclasse: Carro herda de Veiculo&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&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;numeroPortas&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;marca&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;modelo&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;anoFabricacao&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;numeroPortas&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;marca&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;anoFabricacao&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Chama o construtor da superclasse&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;numeroPortas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numeroPortas&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;abrirPortaMalas&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;"Porta-malas do "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" aberto."&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="c1"&gt;// Sobrescrita do método exibirDetalhes&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;exibirDetalhes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirDetalhes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Chama o método da superclasse&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úmero de Portas: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;numeroPortas&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="c1"&gt;// Subclasse: Moto herda de Veiculo&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Moto&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&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;tipoGuidon&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;Moto&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;marca&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;modelo&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;anoFabricacao&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;tipoGuidon&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;marca&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;anoFabricacao&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;tipoGuidon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tipoGuidon&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;empinar&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;modelo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" empinando."&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="c1"&gt;// Exemplo de uso&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;GaragemVirtual&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;Veiculo&lt;/span&gt; &lt;span class="n"&gt;meuVeiculo&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;Veiculo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Generica"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Modelo Base"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;meuVeiculo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirDetalhes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;meuVeiculo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ligar&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;"---"&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;meuCarro&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;"Ford"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Focus"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2023&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;meuCarro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirDetalhes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Exibe detalhes do Veiculo e do Carro&lt;/span&gt;
        &lt;span class="n"&gt;meuCarro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ligar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;meuCarro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abrirPortaMalas&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;"---"&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;minhaMoto&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;"Honda"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"CBR 600RR"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Esportivo"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;minhaMoto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirDetalhes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;minhaMoto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ligar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;minhaMoto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empinar&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;Vamos explorar melhor o que esse código faz.&lt;/p&gt;

&lt;p&gt;Veiculo é a "família" principal, ela define as características e comportamentos que todos os membros da família de veículos possuem.&lt;/p&gt;

&lt;p&gt;Carro, Moto (e Caminhao, se criado) são os "filhos" que herdam, eles estendem (&lt;strong&gt;extends&lt;/strong&gt;) as características de Veiculo e adicionam suas próprias particularidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;super()&lt;/strong&gt; é como dizer "mãe/pai, faça o que você faz de melhor", no construtor das subclasses, &lt;strong&gt;super(marca, modelo, anoFabricacao)&lt;/strong&gt; chama o construtor da superclasse, garantindo que as propriedades de Veiculo sejam inicializadas corretamente.&lt;/p&gt;

&lt;p&gt;Em relação a reutilização, observe que não precisamos reescrever marca, modelo, anoFabricacao, ligar() ou desligar() em Carro ou Moto. Eles simplesmente herdam essas funcionalidades de Veiculo.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Polimorfismo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Por último, mas não menos importante, temos o polimorfismo (muitas formas). Esse conceito permite que objetos de diferentes classes sejam tratados como objetos de uma classe comum, desde que essas classes compartilhem uma superclasse ou implementem uma interface. Isso proporciona grande flexibilidade e extensibilidade ao seu código.&lt;/p&gt;

&lt;p&gt;Imagine que você é o maestro de uma orquestra. Em sua orquestra, você tem diversos tipos de instrumentos: violino, flauta, bateria, etc. Cada um desses instrumentos, quando tocado, produz um som. No entanto, a maneira como cada um produz o som é diferente. Um violino é tocado com um arco, uma flauta é soprada e a bateria é batida.&lt;/p&gt;

&lt;p&gt;Como maestro, você não precisa saber os detalhes específicos de como cada instrumento produz o som. Você simplesmente dá a instrução genérica "Tocar!". E cada instrumento, em sua "própria forma", executa essa instrução, produzindo seu som característico.&lt;/p&gt;

&lt;p&gt;Tudo bem, a teoria é bem interessante, mas como isso funciona na prática? Vamos ver!&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;// Classe base: InstrumentoMusical&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InstrumentoMusical&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="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;InstrumentoMusical&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="c1"&gt;// Método polimórfico: tocar&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;tocar&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;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" está produzindo um som."&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="c1"&gt;// Subclasse: Violino herda de InstrumentoMusical&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Violino&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;InstrumentoMusical&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;Violino&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Violino"&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="c1"&gt;// Sobrescrita do método tocar()&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;tocar&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 violino está vibrando as cordas."&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="c1"&gt;// Subclasse: Flauta herda de InstrumentoMusical&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Flauta&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;InstrumentoMusical&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;Flauta&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Flauta"&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="c1"&gt;// Sobrescrita do método tocar()&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;tocar&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;"A flauta está soprando o ar."&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="c1"&gt;// Subclasse: Bateria herda de InstrumentoMusical&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bateria&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;InstrumentoMusical&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;Bateria&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Bateria"&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="c1"&gt;// Sobrescrita do método tocar()&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&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 bateria está batendo nas peles."&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="c1"&gt;// Exemplo de uso: A Orquestra&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;Orquestra&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="c1"&gt;// Criando instâncias de diferentes instrumentos&lt;/span&gt;
        &lt;span class="nc"&gt;InstrumentoMusical&lt;/span&gt; &lt;span class="n"&gt;violino&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;Violino&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;InstrumentoMusical&lt;/span&gt; &lt;span class="n"&gt;flauta&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;Flauta&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;InstrumentoMusical&lt;/span&gt; &lt;span class="n"&gt;bateria&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;Bateria&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Um array que pode conter qualquer InstrumentoMusical&lt;/span&gt;
        &lt;span class="nc"&gt;InstrumentoMusical&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;minhaOrquestra&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;violino&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flauta&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bateria&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;"Maestro diz: 'Tocar!'"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// O polimorfismo em ação: chamando tocar() em cada instrumento&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;InstrumentoMusical&lt;/span&gt; &lt;span class="n"&gt;instrumento&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;minhaOrquestra&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;instrumento&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tocar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Cada instrumento executa seu próprio método tocar()&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;Podemos entender o seguinte. InstrumentoMusical é a "classe base" genérica, ela define a ação comum que todos os instrumentos podem fazer: tocar().&lt;/p&gt;

&lt;p&gt;Violino, Flauta e Bateria são as "formas específicas", eles estendem InstrumentoMusical e, crucialmente, sobrescrevem (&lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;) o método tocar() para implementar sua forma particular de produzir som.&lt;/p&gt;

&lt;p&gt;A lista minhaOrquestra é o "maestro", ela pode conter objetos de diferentes tipos (Violino, Flauta, Bateria), mas os trata todos como InstrumentoMusical.&lt;/p&gt;

&lt;p&gt;O for loop é a "instrução do maestro", quando instrumento.tocar() é chamado dentro do loop, o Java automaticamente determina qual versão do método tocar() deve ser executada em tempo de execução, com base no tipo real do objeto (se é um Violino, uma Flauta ou uma Bateria).&lt;/p&gt;

&lt;p&gt;Bem, era isso que eu queria trazer. Considere que os pilares da OO não são teorias acadêmicas, mas ferramentas práticas que nos ajudam a reduzir a complexidade, evitar duplicação e facilitar extensões do nosso código. Dominar esses recursos nos permite criar sistemas menos propensos a bugs, facilmente extensíveis e alinhados com o domínio do problema em questão.&lt;/p&gt;

&lt;p&gt;Mas não leve isso ao extremo, se esforce para ter a percepção de quando vale a pena aplicar cada um desses recursos. A chave é ter equilíbrio. &lt;strong&gt;"Prefira composição em vez de herança"&lt;/strong&gt; e &lt;strong&gt;"Nem tudo precisa ser uma classe"&lt;/strong&gt; são máximas que evitam armadilhas comuns. Comece com problemas simples e evolua para cenários de maior complexidade, quando menos perceber, estará fazendo isso de forma automática.&lt;/p&gt;

&lt;p&gt;Muito obrigado por ter lido até aqui, e por favor, caso eu tenha deixado passar algum detalhe importante, ou você tenha uma analogia mais clara para cada uma das construídas aqui, compartilhe abaixo nos comentários. Ficarei feliz em ler cada uma com a devida atenção. E caso você queira se aprofundar mais no assunto, seguem duas ótimas referências:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Design Patterns&lt;/strong&gt;: Elements of Reusable Object-Oriented Software (Gamma et al.).&lt;/em&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Clean Code&lt;/strong&gt;: A Handbook of Agile Software Craftsmanship (Robert C. Martin).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>softwareengineering</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
