{"componentChunkName":"component---src-templates-blog-post-js","path":"/java-iniciante-pt8/","result":{"data":{"markdownRemark":{"html":"<h2 id=\"Polimorfismo-e-Interface\" style=\"position:relative;\">Polimorfismo e Interface<a href=\"#Polimorfismo-e-Interface\" aria-label=\"Polimorfismo e Interface permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>No último <a href=\"https://programadev.com.br/java-iniciante-pt7/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">artigo</a> foi mostrado a <strong>Herança</strong> e como podemos fazer uso de <strong>Classes Abstratas</strong>, para criar estruturas que podem ser usadas para realizar <strong>Herança</strong> mas sem que sejam criadas classes a partir delas. Agora vamos abordar o tema <strong>Polimorfismo</strong> e como é importante esse conhecimento para se trabalhar de forma orientada a objetos com <strong>Java</strong>.</p>\n<p><strong>Polimorfismo</strong> 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.</p>\n<p>Ao fim desse artigo você será capaz de saber usar e identificar o <strong>Polimorfismo</strong> em seu código e também estará ciente das vantagens que esse recurso trás.</p>\n<p>Antes mesmo de entrar no assunto de <strong>Polimorfismo</strong> é extremamente importante entender o que é uma <strong>Interface</strong> na <strong>Java</strong>, pois é um recurso muito usado em conjunto com <strong>Polimorfismo</strong>.</p>\n<p>Uma <strong>Interface</strong> é um contrato que define “esqueletos” de métodos para que sejam implementados por classes. Muito similares com a ideia de <strong>Classes Abstratas</strong>, é uma estrutura que não pode ser instanciada porém existem diferenças entre <strong>Interfaces</strong> e <strong>Classes Abstratas</strong> e iremos ver algumas no decorrer do artigo.</p>\n<p>Voltando ao exemplo base que está sendo usado nos outros artigos, a nossa aplicação bancária possui uma <strong>Classe Abstrata</strong> que se refere a uma <strong>Conta</strong> 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 <strong>Conta</strong> foi definida como uma <strong>Classe Abstrata</strong> onde através de <strong>Herança</strong> foi definido classes filhas ou sub-classes de <strong>Conta</strong> (<strong>PessoaFisica</strong> e <strong>PessoaJuridica</strong>), então podemos concluir que as classes <strong>PessoaFisica</strong> e <strong>PessoaJuridica</strong> são do mesmo tipo da classe <strong>Conta</strong> já que são filhas e isso é chamado de relacionamento <strong>É-UM</strong> onde a classe <strong>PessoaFisica</strong> é considerada uma <strong>Conta</strong>. Podemos definir outro tipo de relacionamento no <strong>Java</strong> onde a classe também será do tipo <strong>É-UM</strong> porém com uma ideia mais voltada para a capacidade que essa classe irá possuir e fazemos isso com <strong>Interface</strong>.</p>\n<p>Para ficar mais claro vamos criar uma <strong>Interface</strong> que será responsavel pelos serviços de financiamentos, vamos chamá-la de <strong>Financiamento</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Financiamento</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">boolean</span> <span class=\"token function\">pegaEmprestimo</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> conta<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">liberaEmprestimo</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> conta<span class=\"token punctuation\">,</span> <span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código anterior foi definido dois métodos, um chamado <em>pegaEmprestimo</em> que recebe uma <strong>Conta</strong> como argumento e devolve um <strong>boolean</strong> e outro chamado <em>liberaEmprestimo</em> que também recebe uma <strong>Conta</strong> e devolve um <strong>BigDecimal</strong> que seria referente ao valor do emprestimo liberado. Podemos ver que uma <strong>Interface</strong> 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 <strong>default</strong> como vimos em artigos anteriores, nesse caso não precisamos informar mas todo método em uma <strong>Interface</strong> é automaticamente <strong>public</strong> e <strong>abstract</strong> sempre.</p>\n<p>Com a <strong>Interface</strong> criada iremos criar uma classe chamada <strong>Banco</strong> e iremos fazer com que essa classe possa ter a capacidade de fornecer financiamentos:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Banco</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Financiamento</span><span class=\"token punctuation\">{</span>\n    \n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Conta</span><span class=\"token punctuation\">></span></span> contas<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Banco</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Conta</span><span class=\"token punctuation\">></span></span> contas<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>nome <span class=\"token operator\">=</span> nome<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>contas <span class=\"token operator\">=</span> contas<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    \n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">boolean</span> <span class=\"token function\">pegaEmprestimo</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> conta<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Random</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">nextBoolean</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">liberaEmprestimo</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> conta<span class=\"token punctuation\">,</span> <span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">pegaEmprestimo</span><span class=\"token punctuation\">(</span>conta<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token keyword\">return</span> valor<span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">return</span> valor<span class=\"token punctuation\">.</span><span class=\"token function\">divide</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">String</span> <span class=\"token function\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> nome<span class=\"token punctuation\">;</span>    \n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Conta</span><span class=\"token punctuation\">></span></span> <span class=\"token function\">getContas</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">.</span><span class=\"token function\">copyOf</span><span class=\"token punctuation\">(</span>contas<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Nesse exemplo temos a classe <strong>Banco</strong> e quando queremos usar <strong>Interfaces</strong> adicionamos a palavra reservada <strong>implements</strong> que como o próprio nome diz irá implementar aquela <strong>Interface</strong> e criar um relacionamento entre a <strong>Classe</strong> e a <strong>Interface</strong>, também foi necessário implementar os métodos <em>pegaEmprestimo</em> e <em>liberaEmprestimo</em>, onde o <em>pegaEmprestimo</em> só devolve um <strong>boolean</strong> aleatório e o método <em>liberaEmprestimo</em> que se baseia no retorno do <em>pegaEmprestimo</em> para saber a quantidade que será liberada de crédito, caso a analise de crédito retorne um <strong>true</strong> ele poderá pegar o valor total solicitado e caso retorne <strong>false</strong> poderá pegar a metade.</p>\n<p>Podemos começar a ver um pouco de <strong>Polimorfismo</strong> nesse código onde os métodos <em>pegaEmprestimo</em> e <em>liberaEmprestimo</em> recebem como argumento uma <strong>Conta</strong> 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 <strong>PessoaFisica</strong> ou <strong>PessoaJuridica</strong>.</p>\n<p>Agora podemos criar uma instância de <strong>Banco</strong> e fazer as operações de <strong>Financiamento</strong> para as <strong>Contas</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Main</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token class-name\">Conta</span> contaFisicaGuilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">Conta</span> contaJuridicaGuilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaJuridica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Empresa do Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\">Banco</span> banco <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Banco</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MeuBanco\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>contaFisicaGuilherme<span class=\"token punctuation\">,</span> contaFisicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\">BigDecimal</span> valorLiberado <span class=\"token operator\">=</span> banco<span class=\"token punctuation\">.</span><span class=\"token function\">liberaEmprestimo</span><span class=\"token punctuation\">(</span>contaFisicaGuilherme<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor liberado %s para conta %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>valorLiberado<span class=\"token punctuation\">,</span> contaFisicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        valorLiberado <span class=\"token operator\">=</span> banco<span class=\"token punctuation\">.</span><span class=\"token function\">liberaEmprestimo</span><span class=\"token punctuation\">(</span>contaJuridicaGuilherme<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"10000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Valor liberado %s para conta %s\"</span><span class=\"token punctuation\">.</span><span class=\"token function\">formatted</span><span class=\"token punctuation\">(</span>valorLiberado<span class=\"token punctuation\">,</span> contaJuridicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Explicando o código acima, primeiramente criamos duas classes, uma para <strong>PessoaFisica</strong> e outra para <strong>PessoaJuridica</strong> porém as duas foram atribuídas para variáveis do tipo <strong>Conta</strong>, isso também é o <strong>Polimorfismo</strong> em ação pois como foi dito anteriormente tanto a classe <strong>PessoaFisica</strong> quanto <strong>PessoaJuridica</strong> são filhas ou sub-classes da classe <strong>Conta</strong> e por isso podemos referenciar dessa maneira, e podemos passar para o método <strong>liberaEmprestimo</strong> uma <strong>PessoaFisica</strong> ou <strong>PessoaJuridica</strong> que são uma <strong>Conta</strong> também, porém poderíamos passar uma variável do tipo <strong>PessoaFisica</strong> ou <strong>PessoaJuridica</strong> pois como dissemos elas também são do tipo <strong>Conta</strong>.</p>\n<p>Um ponto diferente entre <strong>Interfaces</strong> e <strong>Classes Abstratas</strong> é que pode haver múltiplas implementações de <strong>Interfaces</strong> para uma classe, coisa que não pode acontecer com <strong>Classes Abstratas</strong> já que não existe <strong>Herança</strong> múltipla no <strong>Java</strong> mas com <strong>Interfaces</strong> podemos adicionar esse comportamento e para exemplificar isso iremos criar outra <strong>Interface</strong> para serviços de transferências do banco:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Transferencia</span> <span class=\"token punctuation\">{</span>\n    \n    <span class=\"token keyword\">void</span> <span class=\"token function\">realizaTransferencia</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> origem<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Conta</span> destino<span class=\"token punctuation\">,</span> <span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Criamos uma <strong>Interface</strong> <strong>Transferencia</strong> com um método <strong>realizaTransferencia</strong> que recebe a <strong>Conta</strong> de origem, a <strong>Conta</strong> de destino e o valor da transferência, e aqui fica bem claro a ideia de <strong>Polimorfismo</strong> já que não amarramos uma transferência para uma conta jurídica ou física; vamos adicionar essa funcionalidade na classe <strong>Banco</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Banco</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Financiamento</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Pagamento</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token comment\">//TODO O RESTO OMITIDO</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">realizaTransferencia</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Conta</span> origem<span class=\"token punctuation\">,</span> <span class=\"token class-name\">Conta</span> destino<span class=\"token punctuation\">,</span> <span class=\"token class-name\">BigDecimal</span> valor<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">BigDecimal</span> valorSacado <span class=\"token operator\">=</span> origem<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span>valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        destino<span class=\"token punctuation\">.</span><span class=\"token function\">deposita</span><span class=\"token punctuation\">(</span>valorSacado<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Como visto no código acima para fazer a implementação de múltiplas <strong>Interfaces</strong> no <strong>Java</strong> basta adicioná-las após a palavra <strong>implements</strong> 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 <strong>Polimorfismo</strong> 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 <strong>Conta</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Conta</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">protected</span>  <span class=\"token class-name\">BigDecimal</span> saldo<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Conta</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"1000\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Foi adicionado o atributo <strong>saldo</strong> que também foi adicionado ao construtor da classe <strong>Conta</strong> 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 <strong>Classe Abstrata</strong> podemos ter um construtor que será usado pelas classe filhas, já nas classes <strong>PessoaFisica</strong> e <strong>PessoaJuridica</strong> 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 <strong>PessoaFisica</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PessoaFisica</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">Conta</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> TIPO_DE_DOCUMENTO <span class=\"token operator\">=</span> <span class=\"token string\">\"CPF\"</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token comment\">//CHAMADA AO CONSTRUTOR DA CLASSE MÃE</span>\n        <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>documento <span class=\"token operator\">=</span> TIPO_DE_DOCUMENTO<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>nome <span class=\"token operator\">=</span> nome<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"SAQUE PARA PESSOA \"</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>nome <span class=\"token operator\">+</span> <span class=\"token string\">\" COM DOCUMENTO \"</span> <span class=\"token operator\">+</span>  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>documento<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">//LÓGICA PARA ADICIONAR AO SALDO</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">subtract</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">BigDecimal</span> <span class=\"token function\">deposita</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span> quantidade<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"DEPOSITANDO PARA PESSOA \"</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>nome <span class=\"token operator\">+</span> <span class=\"token string\">\" COM DOCUMENTO \"</span> <span class=\"token operator\">+</span>  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>documento<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\">//LÓGICA PARA SUBTRAIR DO SALDO</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>saldo<span class=\"token punctuation\">.</span><span class=\"token function\">add</span><span class=\"token punctuation\">(</span>quantidade<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> quantidade<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>As mudanças no código foram:</p>\n<ul>\n<li>No construtor foi adicionado uma chamada ao construtor da classe mãe através do <strong>super()</strong>.</li>\n<li>Tanto no método <strong>saca</strong> quanto no <strong>deposita</strong> foi chamado o atributo saldo para adicionar fundos, no método <strong>saca</strong>, ou para subtrair fundos, método <strong>deposita</strong>.</li>\n</ul>\n<p>E agora executando esse código:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Main</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token keyword\">void</span> <span class=\"token function\">main</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> args<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n        <span class=\"token class-name\">Conta</span> contaFisicaGuilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">Conta</span> contaJuridicaGuilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaJuridica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Empresa do Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\">Banco</span> banco <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Banco</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MeuBano\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>contaFisicaGuilherme<span class=\"token punctuation\">,</span> contaFisicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        banco<span class=\"token punctuation\">.</span><span class=\"token function\">realizaTransferencia</span><span class=\"token punctuation\">(</span>contaFisicaGuilherme<span class=\"token punctuation\">,</span> contaJuridicaGuilherme<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"10\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>contaFisicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>contaJuridicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Teremos como saída o seguinte:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Conta<span class=\"token punctuation\">{</span>nome<span class=\"token operator\">=</span><span class=\"token string\">'Guilherme'</span>, <span class=\"token assign-left variable\">documento</span><span class=\"token operator\">=</span><span class=\"token string\">'CPF'</span>, <span class=\"token assign-left variable\">saldo</span><span class=\"token operator\">=</span><span class=\"token number\">990</span><span class=\"token punctuation\">}</span>\nConta<span class=\"token punctuation\">{</span>nome<span class=\"token operator\">=</span><span class=\"token string\">'Empresa do Guilherme'</span>, <span class=\"token assign-left variable\">documento</span><span class=\"token operator\">=</span><span class=\"token string\">'CNPJ'</span>, <span class=\"token assign-left variable\">saldo</span><span class=\"token operator\">=</span><span class=\"token number\">1010</span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>Uma novidade que passou a existir a partir do <strong>Java 8</strong> foi a possibilidade de haver um método implementado em uma <strong>Interface</strong>, antes só as <strong>Classes Abstratas</strong> poderiam possuir métodos implementados. Vamos ver isso em ação criando uma <strong>Interface</strong> para <strong>Auditoria</strong>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Auditoria</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">void</span> <span class=\"token function\">audita</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"REALIZANDO AUDITORIA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A <strong>Interface</strong> <strong>Auditoria</strong> possui um método chamado <em>audita</em> e este método já possui uma implementação e indicamos isso através da palavra <strong>default</strong> seguido do método e de sua implementação, se quisermos implementar essa <strong>Interface</strong> na classe <strong>Banco</strong> não será mais obrigatório fornecer uma implementação para esse método:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Banco</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Financiamento</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Pagamento</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Auditoria</span><span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">//TODO RESTO OMITIDO</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Não foi obrigatório fornecer uma implementação porém se for necessário podemos sobrescrever o método <em>audita</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token annotation punctuation\">@Override</span>\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">audita</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">Auditoria</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">audita</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"AUDITORIA CUSTOMIZADA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Sobrescrevemos o método <em>audita</em> porém é possível manter a implementação padrão através da chamada <strong>Auditoria.super.audita()</strong> onde o <strong>super</strong> serve para invocar o método que está na <strong>Interface</strong>. Se executarmos esse código agora:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Conta</span> contaFisicaGuilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaFisica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">Conta</span> contaJuridicaGuilherme <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">PessoaJuridica</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Empresa do Guilherme\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token class-name\">Banco</span> banco <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Banco</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MeuBano\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">List</span><span class=\"token punctuation\">.</span><span class=\"token function\">of</span><span class=\"token punctuation\">(</span>contaFisicaGuilherme<span class=\"token punctuation\">,</span> contaFisicaGuilherme<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nbanco<span class=\"token punctuation\">.</span><span class=\"token function\">audita</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O resultado será:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">REALIZANDO AUDITORIA\nAUDITORIA CUSTOMIZADA</code></pre></div>\n<p>O último ponto entre <strong>Interfaces</strong> e <strong>Classes Abstratas</strong> é que não podemos adicionar atributos em <strong>Interfaces</strong> mas conseguimos fazer isso em <strong>Classes Abstratas</strong>.</p>\n<h2 id=\"Problema-Diamante\" style=\"position:relative;\">Problema Diamante<a href=\"#Problema-Diamante\" aria-label=\"Problema Diamante permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>No último artigo falamos que não existe <strong>Herança</strong> múltipla no <strong>Java</strong> 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 <strong>Interfaces</strong> e é permitido implementar múltiplas <strong>Interfaces</strong>, como esse problema é contornado nesses casos?</p>\n<p>Vamos criar duas <strong>Interfaces</strong>, <strong>Log</strong> e <strong>Logger</strong> e as duas irão conter um método chamado <em>log</em>:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Log</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">void</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"REALIZANDO LOG\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">interface</span> <span class=\"token class-name\">Logger</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">default</span> <span class=\"token keyword\">void</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"REALIZANDO LOGGER\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>As duas <strong>Interfaces</strong> possuem a mesma assinatura e as duas possuem métodos já implementados, se adicionarmos essas <strong>Interfaces</strong> na classe <strong>Banco</strong> 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.</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Banco</span> <span class=\"token keyword\">implements</span> <span class=\"token class-name\">Log</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">Logger</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token annotation punctuation\">@Override</span>\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token class-name\">Log</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token class-name\">Logger</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">super</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>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 <strong>Banco</strong>.</p>\n<p>Para saber mais sobre o <a href=\"https://en.wikipedia.org/wiki/Multiple_inheritance\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Problema Diamante</a>.</p>\n<h2 id=\"Quando-usar-Interface-ou-Classe-Abstrata\" style=\"position:relative;\">Quando usar Interface ou Classe Abstrata?<a href=\"#Quando-usar-Interface-ou-Classe-Abstrata\" aria-label=\"Quando usar Interface ou Classe Abstrata permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Não existe uma resposta padrão para essa pergunta porém podemos analisar qual usar de acordo com alguns critérios:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token operator\">|</span>---------------------------------------<span class=\"token operator\">|</span>---------------------------------------------------------<span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span>              Interface                <span class=\"token operator\">|</span>                  Classe Abstrata                        <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span>---------------------------------------<span class=\"token operator\">|</span>---------------------------------------------------------<span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> Várias implementações que compartilham<span class=\"token operator\">|</span> Compartilhar código em classes relacionadas que possuem <span class=\"token operator\">|</span> \n<span class=\"token operator\">|</span> a mesma assinatura de método          <span class=\"token operator\">|</span> um comportamento em comum                               <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span>---------------------------------------<span class=\"token operator\">|</span>---------------------------------------------------------<span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> Adicionar comportamento mesmo sem     <span class=\"token operator\">|</span> Compartilhar atributos entre classes                    <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> ter total certeza de como será        <span class=\"token operator\">|</span>                                                         <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> a implementação                       <span class=\"token operator\">|</span>                                                         <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span>---------------------------------------<span class=\"token operator\">|</span>---------------------------------------------------------<span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span> Fazer uso de múltiplas implementações <span class=\"token operator\">|</span> Controle de acesso através de modificadores de acessos  <span class=\"token operator\">|</span>\n<span class=\"token operator\">|</span>---------------------------------------<span class=\"token operator\">|</span>---------------------------------------------------------<span class=\"token operator\">|</span></code></pre></div>\n<h2 id=\"Utilizacao-de-Polimorfismo-pela-linguagem\" style=\"position:relative;\">Utilização de Polimorfismo pela linguagem<a href=\"#Utilizacao-de-Polimorfismo-pela-linguagem\" aria-label=\"Utilizacao de Polimorfismo pela linguagem permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>A própria linguagem <strong>Java</strong> faz muito uso de <strong>Polimorfismo</strong> por padrão, um exemplo disso é a <strong>Interface</strong> <strong>List</strong> que possui diversas implementações:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">List</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">String</span><span class=\"token punctuation\">></span></span> lista <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ArrayList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nlista <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">LinkedList</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nlista <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Vector</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nlista <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Stack</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Podemos ver que a variável <strong>lista</strong> pode carregar várias implementações pois todas essas classes implementam direta ou indiretamente a <strong>Interface</strong> <strong>List</strong>.</p>\n<h2 id=\"Conclusao\" style=\"position:relative;\">Conclusão<a href=\"#Conclusao\" aria-label=\"Conclusao permalink\" class=\"anchor after\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a></h2>\n<p>Neste artigo exploramos <strong>Interfaces</strong> e como podemos fazer uso delas para criar código <strong>Polimórficos</strong>.</p>\n<p>O código deste artigo se encontra no <a href=\"https://github.com/guilhermegarcia86/helloworld\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHub</a></p>\n<p>Visite também o nosso canal no <a href=\"https://www.youtube.com/channel/UCDWmrzFPkkQf5VI_ziZrgvw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Youtube</a> para mais acompanhar essa série de <strong>Primeiros passos com o Java</strong> e muito mais conteúdos sobre programação.</p>","fields":{"slug":"/java-iniciante-pt8/"},"frontmatter":{"date":"17 de novembro de 2021","description":"POO Polimorfismo e Interface","title":"Primeiros passos com Java VIII","tags":["Java","Beginner","POO","Polimorfismo"],"author":"Guilherme Alves","image":{"id":"244729b0-2903-558d-8c44-900199445a69","publicURL":"/static/7b77c24cbe6ee85b491a78d46afe6b83/java-artigoVIII.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB6klEQVQ4y31U2W7bMBAUD8k6LSlyjdSJDffBcgzlAFK0gf3mfoBj9P//Zbq7JlWqD31Y8NjVcGaWVKS1hla3UEpBRRG0tbBNCzubwaYZTFHCcJ3UKplzSL0L7cbIL3wxr03dwKQpdBzDVPXtkABI6pUnoiYR+eRYyB/V7W1OzGw1h3Fg+h+WWk8BheF4qgtmY/OC5KYwNkbcfRHpoYop079gAUO3SWCcsMbAZrl8FJNkW1YOyASgZgLqvYx0IDVJEgGN/hNcF1PTwvVEstCkRD2fo21bbLdbDMOAr/f32Gw2ODwd8LBaYb1eY/34iG+Uf3t9Rb/bYblcjlInXVa+GSR1R4Xn81nG4/GIy+WCl+cXfH9/x+l0kr1flP/4+YHhcBAyhm7DpMvKsWTJRVGINyldmzmx7roOK2LYNg3qukZKDQotiPcDdNvJXNFticLLyZspdbfIcwGc0QFJnAj70TNuCCnhsShLVD9OKB/WSHyNbwIXMWhVVeju7sRPjsViQexa6fz4ktzH7Ofv6xX9fo+SwAXQUscakpNl2ciS92YkjeXF3h/nMa85z8B93+P6+UkeP4+HCWA9r4UZn8LBknMXPGdf82CP7bg9AjVeHU8mCg1mBsyM2XqgECxjX/mHwfK5Ce4hRG7O4x+dyTPBeCLvtQAAAABJRU5ErkJggg==","aspectRatio":1.4096916299559472,"src":"/static/7b77c24cbe6ee85b491a78d46afe6b83/0823f/java-artigoVIII.png","srcSet":"/static/7b77c24cbe6ee85b491a78d46afe6b83/c67b7/java-artigoVIII.png 320w,\n/static/7b77c24cbe6ee85b491a78d46afe6b83/d3930/java-artigoVIII.png 640w,\n/static/7b77c24cbe6ee85b491a78d46afe6b83/0823f/java-artigoVIII.png 1280w,\n/static/7b77c24cbe6ee85b491a78d46afe6b83/b3c49/java-artigoVIII.png 1745w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":11}},"pageContext":{"slug":"/java-iniciante-pt8/","previous":{"fields":{"slug":"/java-iniciante-pt7/"},"frontmatter":{"title":"Primeiros passos com Java VII","date":"09 nov, 2021"}},"next":{"fields":{"slug":"/java-iniciante-p9/"},"frontmatter":{"title":"Primeiros passos com Java IX","date":"30 nov, 2021"}}}},"staticQueryHashes":["63159454"]}