{"componentChunkName":"component---src-templates-blog-post-js","path":"/java-iniciante-pt7/","result":{"data":{"markdownRemark":{"html":"<p>No último <a href=\"https://programadev.com.br/java-iniciante-pt6/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">artigo</a> iniciamos o assunto sobre <strong>Herança</strong> e neste artigo será concluído o tema e apresentado o assunto de abstração. Você verá formas de usar esses conceitos para construção de códigos mais consistentes e legíveis.</p>\n<p>No projeto que foi apresentado existe a seguinte situação, em um sistema bancário podemos ter dois tipos de conta, a conta para pessoa física e a conta para pessoa jurídica, para isso foi criado uma classe chamada <strong>Conta</strong> que serve de molde para as classes <strong>PessoaFisica</strong> e <strong>PessoaJuridica</strong> e fazendo uso de <strong>Herança</strong> isso é possível, porém no decorrer percebemos que era possível criar uma instância da classe <strong>Conta</strong> e para a regra dessa aplicação isso não deveria ser possível, mas como podemos fazer uso de <strong>Herança</strong> sem que aja uma breja que pode ser usada de forma equivocada? Iremos ver nesse artigo como podemos fazer uso de <strong>Abstração</strong> para suprir isso.</p>\n<h2 id=\"Classes-Abstratas\" style=\"position:relative;\">Classes Abstratas<a href=\"#Classes-Abstratas\" aria-label=\"Classes Abstratas 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 nosso exemplo de código seria muito útil se houvesse uma forma de ter uma estrutura de dados que guardasse os atributos e métodos em comum de uma <strong>Conta</strong> mas que não pudesse ser instanciada e que permitisse o uso de <strong>Herança</strong>. Essa estrutura existe e é chamada de <strong>Classe Abstrata</strong>, vamos ver como criar e depois entenderemos melhor os seus benefícios:</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\">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\">String</span> documento<span class=\"token punctuation\">;</span>\n\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\">\"EXECUTA REGRA DE NEGÓCIO GENERALISTA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">.</span>ZERO<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\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\">\"EXECUTA REGRA DE NEGÓCIO GENERALISTA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">.</span>ZERO<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">//Todo o resto omitido</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Reaproveitamos a classe <strong>Conta</strong> e adicionamos o modificador de acesso <strong>abstract</strong>, isso já serve em partes pois se tentarmos instanciar uma classe <strong>Conta</strong> não será mais possível:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Conta</span> conta <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Conta</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Isso gera erro de compilação:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token string\">'Conta'</span> is abstract<span class=\"token punctuation\">;</span> cannot be instantiated</code></pre></div>\n<p>Agora vamos entender um pouco mais o que é uma <strong>Classe Abstrata</strong>. Uma <strong>Classe Abstrata</strong> é uma classe que não pode ser instanciada somente herdada, ela também tem a capacidade de definir métodos sem implementação, chamado de <strong>métodos abstratos</strong> que são métodos que contém somente a assinatura e que a classe que herdar da <strong>Classe Abstrata</strong> deve se preocupar com a sua implementação, porém também é possível ter métodos implementados em uma <strong>Classe Abstrata</strong> e através de <strong>sobrescrita de métodos</strong> customizá-los nas classes que herdarem a <strong>Classe Abstrata</strong>.</p>\n<p>*<em>OBS: Porém qual estratégia é melhor usar? Deixar métodos implementados nas classes abstratas que podem ser sobrescritos ou deixá-los para serem implementados nas classes filhas? Essa pergunta não é tão simples de responder e cabe a você como desenvolvedor pensar no que faz sentido para cada caso.</em></p>\n<p>Para deixar mais claro vamos ver como ficou o código na 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\">String</span> nome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">protected</span> <span class=\"token class-name\">String</span> documento<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">abstract</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\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\">\"EXECUTA REGRA DE NEGÓCIO GENERALISTA\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">.</span>ZERO<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">//Restante omitido</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Tem alguns pontos significativos que foram alterados porém agora vamos focar na alteração do método <strong>deposita</strong> onde foi adicionado o modificador <strong>abstract</strong> e removido a implementação do método. Isso significa que esse método deve ter obrigatoriamente uma implementação válida na classe que herdar da classe <strong>Conta</strong>, essa é uma forma de garantirmos que iremos ter um método customizado sendo implementado na classe que for filha da classe <strong>Conta</strong>, se tentarmos herdar uma <strong>Classe Abstrata</strong> com um <strong>método abstrato</strong> e não implementarmos nada para esse método iremos receber um erro de compilação.</p>\n<p>Outro ponto que vimos no código acima é a utilização de atributos com o modificador <strong>protected</strong>, poderíamos ter atributos <strong>private</strong> ou até mesmo <strong>public</strong> em uma <strong>Classe Abstrata</strong> porém como o conceito de uma <strong>Classe Abstrata</strong> é ser um “molde” que não pode ser instanciado somente herdado faz muito sentido ser usado o modificador <strong>protected</strong> pois ele irá garantir que esses campos só poderão ser usados em <strong>sub-classes</strong> por meio de <strong>Herança</strong>.</p>\n<p>*<em>OBS: Até o Java 7 esse era o único modo de termos métodos concretos e métodos não implementados em um unico arquivo, porém a partir do Java 8 é possível termos métodos implementados em Interfaces porém esse assunto ainda será abordado mais a frente.</em></p>\n<p>Então usando essa ideia podemos fazer da seguinte maneira nas sub-classes de <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\">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 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 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 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>Explicando as alterações que foram feitas acima:</p>\n<ul>\n<li>Foi criado um construtor para receber o nome do titular da conta e atribuído ao atributo <strong>nome</strong> que está na super-classe <strong>Conta</strong>.</li>\n<li>O método <strong>saca</strong> está sobrescrito na classe <strong>PessoaFisica</strong> porém como existe uma implementação na super-classe <strong>Conta</strong> não seria necessário existir aqui, mas podemos fazer uso desse recurso de sobrescrita para customizações.</li>\n<li>O método <strong>deposita</strong> necessita obrigatoriamente de uma implementação na sub-classe pois foi definido como um <strong>método abstrato</strong> na super-classe.</li>\n</ul>\n<p>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 class-name\">Conta</span> conta <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>\nconta<span class=\"token punctuation\">.</span><span class=\"token function\">saca</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">BigDecimal</span><span class=\"token punctuation\">.</span>ZERO<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Antes de ver o resultado desse código reflita um pouco sobre o que deveria acontecer nesse caso? Nós criamos uma instância de <strong>PessoaFisica</strong> porém atribuímos para uma variável do tipo <strong>Conta</strong> e depois chamamos o método <strong>saca</strong>; tanto a classe <strong>Conta</strong> quanto a classe <strong>PessoaFisica</strong> possuem implementações desse método, qual será executado então?</p>\n<p>Analisando o resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">APLICANDO REGRA MUITO ESPECÍFICA SEM CHAMAR A SUPER CLASSE\nSAQUE PARA PESSOA Guilherme COM DOCUMENTO CPF</code></pre></div>\n<p>Ele executou o que havia dentro da classe <strong>PessoaFisica</strong> pois por mais que tenhamos atribuído a uma variável do tipo <strong>Conta</strong> a instância é do tipo <strong>PessoaFisica</strong> mas por qual razão foi possível atribuir uma instancia de <strong>PessoaFisica</strong> em uma variavel do tipo <strong>Conta</strong>?</p>\n<p>Isso acontece graças ao <strong>Polimorfismo</strong> porém esse assunto será visto no próximo artigo, por enquanto entenda que é possível atribuir uma sub-classe para uma variável do tipo da super-classe.</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>Nessa segunda parte do artigo de <strong>Herança</strong> entendemos um pouco mais sobre como podemos fazer uso de <strong>Abstração</strong> com <strong>Classes Abstratas</strong> para poder criar “moldes” de classes que não podem ser criadas sozinhas e que dependem de sub-classes herdadas para serem usadas. No próximo artigo iremos iniciar o assunto de <strong>Polimorfismo</strong> e <strong>Interfaces</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-pt7/"},"frontmatter":{"date":"09 de novembro de 2021","description":"POO Herança e Abstração","title":"Primeiros passos com Java VII","tags":["Java","Beginner","POO"],"author":"Guilherme Alves","image":{"id":"c562e887-22cc-5d00-a5db-5c727c146cc5","publicURL":"/static/4f93084b8eca0c84f258974256bb4b63/java-artigoVII.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB3klEQVQ4y4VTy24aQRCc174f7C4Y4gRiEgmwF4ScAwf7gogcyTnh/P/HVLrHM5sxsuJDa7tnumuqamaFkhI+JIcQUMbAjFqYOIFJU+i8gFIKYW/YL31OIfzC0CQkdN1AJSkBR9BV/XoI7WkC1e8AhyGGghrtKTw0al5BitICaso/AhoA3zYqC2RIIstlhmZ8Bc25FEOfZSrVhXQn+T0/jNYwWW4HDTE0ZQUVsJQX8sNZEdKNo8huiP8E90V0aWGtwkuxummjrmu0TYNvyyV2ux0+zWZYzOfo7+7w5foaXxcLLCiWNzfY7/dYr9eYTqfDhXmWwiMrJ2G1WuF4PKLve5xOJ/x+fsZuu8WP+3s8PjzgJ639enrC4XBAf3tryWjyWjngAZA34jhGURR2o64qzIjlZDy2zLgekYrJZPLGlmizhWo6m8sQ0DelSYIiz5EQOHtlfXUHXvpWlCWqwyPKz3PEyvV4IO3eITPpug5t26KjYIbsrd33PwHlPPOd/P7z8oL1ZoOSlFlAfiINDWT0i3kmvJYQU46IGIbvj2tDzBmcL+Z8PluPB5U8zDdcEbOSJHCw5NwF5+yrrbPMflM63LO0Fjh1rv7njXbMMhosPFgAzkDsLZOw8v1FuJy/fwGbmzN05769NgAAAABJRU5ErkJggg==","aspectRatio":1.4096916299559472,"src":"/static/4f93084b8eca0c84f258974256bb4b63/0823f/java-artigoVII.png","srcSet":"/static/4f93084b8eca0c84f258974256bb4b63/c67b7/java-artigoVII.png 320w,\n/static/4f93084b8eca0c84f258974256bb4b63/d3930/java-artigoVII.png 640w,\n/static/4f93084b8eca0c84f258974256bb4b63/0823f/java-artigoVII.png 1280w,\n/static/4f93084b8eca0c84f258974256bb4b63/cec22/java-artigoVII.png 1746w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":5}},"pageContext":{"slug":"/java-iniciante-pt7/","previous":{"fields":{"slug":"/java-iniciante-pt6/"},"frontmatter":{"title":"Primeiros passos com Java VI","date":"26 out, 2021"}},"next":{"fields":{"slug":"/java-iniciante-pt8/"},"frontmatter":{"title":"Primeiros passos com Java VIII","date":"17 nov, 2021"}}}},"staticQueryHashes":["63159454"]}