{"componentChunkName":"component---src-templates-blog-post-js","path":"/java-iniciante-pt3/","result":{"data":{"markdownRemark":{"html":"<p>Dando continuidade a série de artigos sobre o <strong>Java</strong> hoje erá abordado <strong>métodos</strong>, <strong>escopo</strong> e <strong>recursão</strong>. Ao fim desse artigo você será capaz de entender esses conceitos e também conseguirá aplicá-los em projetos.</p>\n<h2 id=\"Metodos\" style=\"position:relative;\">Métodos<a href=\"#Metodos\" aria-label=\"Metodos 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>Nos artigos anteriores foi mostrado alguns métodos porém não entramos a fundo sobre o que significava aquilo, porém agora chegou a hora de entendê-los a fundo. Um método é uma ação que é desenvolvida porém só deve ser executada em algum momento programado, um método é um bloco de código que deve ser executado em um momento específico do programa.</p>\n<p>A vantagem de usar métodos é o reaproveitamento de códigos onde podemos escrever uma vez aquele bloco e ele poderá ser executado em outros pontos sem que aja a necessidade de reescrever sempre a mesma funcionalidade.</p>\n<p>No código abaixo será escrito um método simples mas onde poderemos ver a sintaxe de um método no <strong>Java</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 class-name\">String</span> <span class=\"token function\">helloWorld</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 string\">\"Olá Mundo!\"</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O método que foi criado irá exibir a mensagem <strong>Olá Mundo!</strong>, porém o que é necessário prestar atenção é a sintaxe como isso foi feito. Um método pode ter um <strong>modificador de acesso</strong> que significa basicamente se esse método pode ser visto por outros arquivos dentro do seu programa, esse assunto será explorado de melhor forma quando for abordado o tema de programação orientada a objetos, mas saiba que são quatro os modificadores de acesso:</p>\n<ul>\n<li><strong>public</strong>: Com esse modificador queremos dizer que ele é público e pode ser usado em outros pontos e pacotes.</li>\n<li><strong>protected</strong>: O <strong>protected</strong> é usado em casos de <strong>Herança</strong> e veremos mais a frente.</li>\n<li><strong>private</strong>: Ele só poderá ser usado dentro do arquivo onde foi escrito.</li>\n<li><strong>sem modificador</strong>: Podemos não colocar nenhum modificador e isso indica que ele é visivel apenas dentro do pacote onde ele foi criado, se tentarmos usar um método em outro pacote ele não estará disponível para uso.</li>\n</ul>\n<p>O segundo ponto é que após a palavra <strong>public</strong> existe a palavra <strong>String</strong> e esse é um ponto obrigatório na linguagem, todo método necessita de um retorno que indica o que aquele método irá devolver ao final do processamento, nesse caso o código retorna uma <strong>String</strong>, que pode ser visto com o trecho <strong>return “Olá Mundo”</strong> onde a palavra <strong>return</strong> também é obrigatória quando existe algum retorno, pode parecer contraditório estar escrito que é obrigatório haver um retorno de método sempre mas não ser obrigatório a palavra <strong>return</strong> mas isso acontece pois nem todo método retorna alguma coisa mas todo método precisa de um retorno. Pode ter ficado meio confuso mas já explico, um método por vezes pode ser somente uma execução sem ter um valor para retornar, para ser mais claro segue um exemplo de um método que exibe um texto no console:</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\">void</span> <span class=\"token function\">printHelloWorld</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\">\"Olá Mundo!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O método <strong>printHelloWorld</strong> não tem um valor para ser retornado após a sua execução, ele só exibe uma mensagem e acaba, para esses casos ainda assim é necessário informar um retorno na assinatura desse método e pensando nisso é usada a palavra reservada <strong>void</strong> que indica que esse método é uma execução mas que não retorna nada após o seu fim, sendo assim não é necessário a palavra <strong>return</strong> dentro do método.</p>\n<p>Após isso é necessário definir o nome do método, em <strong>Java</strong> usamos o que chamamos de <em>camel case</em> para nomenclaturas tanto de métodos como variáveis ou classes onde escrevemos tudo junto em minúsculo e separamos as palavras com letras maiúsculas então nesse caso o nome do método ficou <em>printHelloWorld</em>.</p>\n<p>Todo método após o seu nome possui parênteses <strong>()</strong> isso serve para quando é necessário passar <strong>argumentos</strong> para um método, você já viu isso antes no método <strong>main</strong> onde ele possui <strong>String[] args</strong>, um array de argumentos, porém mesmo que não exista <strong>argumentos</strong> em um método é necessário ter os <strong>parênteses</strong>, para deixar claro como é um método onde existem argumentos segue o exemplo abaixo:</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\">void</span> <span class=\"token function\">printHelloWorld</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 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\">\"Olá Mundo \"</span> <span class=\"token operator\">+</span> nome <span class=\"token operator\">+</span> <span class=\"token string\">\"!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O método acima possui o que é chamado de parâmetros, que é a forma de passar informação para a execução de um método. Nesse caso é passado a variável chamada <em>nome</em> que é do tipo <strong>String</strong> para que seja executada dentro do método <strong>printHelloWorld</strong>.</p>\n<p>Um método pode ter nenhum ou vários parâmetros como no exemplo abaixo:</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\">void</span> <span class=\"token function\">printHelloWorld</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> idade<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\">\"Olá \"</span> <span class=\"token operator\">+</span> nome <span class=\"token operator\">+</span> <span class=\"token string\">\" que tem \"</span> <span class=\"token operator\">+</span> idade <span class=\"token operator\">+</span> <span class=\"token string\">\" anos!\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Toda essa sintaxe de <strong>modificadores de acesso</strong>, <strong>retorno do método</strong>, <strong>nomenclatura</strong> e <strong>argumentos</strong> é chamado de assinatura do método.</p>\n<p>Em um método que possui um retorno diferente de <strong>void</strong> é possível que o seu valor seja atribuído a uma variável para que seja usado em outros pontos do programa:</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\">int</span> <span class=\"token function\">soma</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> x<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> y<span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> x <span class=\"token operator\">+</span> y<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">int</span> resultado <span class=\"token operator\">=</span> <span class=\"token function\">soma</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</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><span class=\"token string\">\"O valor da soma é \"</span> <span class=\"token operator\">+</span> resultado<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>No exemplo acima foi definido o método <strong>soma</strong> que recebe dois argumentos como parâmetros do tipo <strong>int</strong>, executa a soma e retorna o valor. Foi possível capturar o retorno do método e atribuí-lo à variável <strong>resultado</strong> que foi usada mais abaixo para exibir a mensagem.</p>\n<p>Para que os métodos acima sejam executadas e funcionem é necessário uma instância de classe pois todo método ou variável que não for <strong>static</strong> pertence a uma instância de classe, esse assunto será amplamente abordado em orientação a objetos. Isso significa que é necessário construir um objeto e usar o operador de acesso <strong>.</strong> (ponto):</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\">ExemploMetodos</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">helloWorld</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\">\"Olá Mundo!\"</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 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        <span class=\"token class-name\">ExemploMetodos</span> exemploMetodos <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">ExemploMetodos</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        exemploMetodos<span class=\"token punctuation\">.</span><span class=\"token function\">helloWorld</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 acima foi criada a classe <strong>ExemploMetodos</strong> que possui o método <strong>helloWorld</strong> mas só será possível usar o método se existir uma instância ou objeto criado da classe <strong>ExemploMetodos</strong> e para acessar o método dessa instância é necessário usar o operador <strong>.</strong> (ponto).</p>\n<h2 id=\"Escopo\" style=\"position:relative;\">Escopo<a href=\"#Escopo\" aria-label=\"Escopo 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 <strong>Java</strong> uma variável é acessível dentro do bloco onde ela foi criada e isso é chamado de <strong>escopo</strong>.</p>\n<p>Para entender o que é escopo é necessário ver os códigos que foram feitos até aqui:</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\">ExemploEscopo</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">mostraIdade</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> idade<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\">\"A idade é \"</span> <span class=\"token operator\">+</span> idade<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\">void</span> <span class=\"token function\">mostraIdadeII</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\">\"A idade é \"</span> <span class=\"token operator\">+</span> idade<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>O código acima não compila no método <strong>mostraIdadeII</strong> com o erro: <strong>Cannot resolve symbol ‘idade’</strong>. Mesmo a variável <strong>idade</strong> existindo no método <strong>mostraIdade</strong> o escopo dela é pertencente ao método onde ela foi declarada então ela se torna inacessível fora do método <strong>mostraIdade</strong>. Para o código acima funcionar seria necessário definir a variável <strong>idade</strong> em um escopo onde ela fosse visível nos dois métodos:</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\">ExemploEscopo</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">int</span> idade <span class=\"token operator\">=</span> <span class=\"token number\">20</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">void</span> <span class=\"token function\">mostraIdade</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\">\"A idade é \"</span> <span class=\"token operator\">+</span> idade<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\">void</span> <span class=\"token function\">mostraIdadeII</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\">\"A idade é \"</span> <span class=\"token operator\">+</span> idade<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>Agora a variável <strong>idade</strong> está em um escopo maior e é visível em dentro da classe <strong>ExemploEscopo</strong>.</p>\n<p>Todos os blocos no <strong>Java</strong> possuem contexto de escopo, seja classes, métodos, condicionais ou laços de repetição isso significa que uma variável definida dentro de um bloco <strong>if/else</strong> só existe dentro do bloco, ela nasce e morre dentro do bloco não sendo acessível fora:</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\">void</span> <span class=\"token function\">metodoEscopoIf</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">int</span> valor <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n    <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><span class=\"token string\">\"O valor é \"</span> <span class=\"token operator\">+</span> valor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O código acima também não compila com o erro: <strong>Cannot resolve symbol ‘valor’</strong>. Isso ocorre por que mesmo que esse bloco <strong>if</strong> sempre seja executado, pois é um bloco <strong>if</strong> com <strong>true</strong>, a variável <strong>valor</strong> é inciada dentro do bloco <strong>if</strong> e “vive” somente dentro do bloco <strong>if</strong> após encerrar o bloco a variável <strong>valor</strong> deixa de existir.</p>\n<p>O mesmo é válido para laços de repetição:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> indice <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> indice <span class=\"token operator\">&lt;=</span> <span class=\"token number\">10</span><span class=\"token punctuation\">;</span> indice<span class=\"token operator\">++</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\">\"O valor do indice é \"</span> <span class=\"token operator\">+</span> indice<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<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>indice<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Mais uma vez esse código não compila e o erro é o mesmo, pois a variável <strong>indice</strong> foi inicializada dentro do bloco <strong>for</strong> e não existe e não é visível fora do bloco.</p>\n<p>O conceito de escopo é aplicável para todos os bloco de códigos sejam eles os outros blocos condicionais, estruturas de repetição ou classes.</p>\n<h2 id=\"Recursao\" style=\"position:relative;\">Recursão<a href=\"#Recursao\" aria-label=\"Recursao 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>Recursividade é a capacidade de um código se executar repetidas vezes. Para explicar melhor será mais fácil exemplificar a recursão com exemplos, então imaginando um problema onde desejamos exibir na tela a sequência de um número até 0:</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\">void</span> <span class=\"token function\">exibirSequencia</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> numero<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>numero <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <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>numero<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">exibirSequencia</span><span class=\"token punctuation\">(</span><span class=\"token operator\">--</span>numero<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse código usa recursão para exibir a sequência de números. Mas vamos entender linha por linha como a recursão é executada nesse código:</p>\n<ul>\n<li>Quando o valor de <strong>numero</strong> for igual a 0 (zero), para a chamada do método recursivo.</li>\n<li>O valor atual da variável <strong>número</strong> é exibida.</li>\n<li>O método <strong>exibirSequencia</strong> é executado novamente porém agora com o valor da variável <strong>numero</strong> é pré-decrementado, diminuído, em menos 1.</li>\n</ul>\n<p>Um cuidado em chamadas recursivas é que facilmente podem gerar <strong>loops infinitos</strong> e erros do tipo <strong>Estouro de pilha</strong> ou <strong>StackOverflowError</strong> onde a memória de execução do programa estoura, para simular esse erro não é difícil no código que testamos, basta alterar o pré-decremento da variável <strong>numero</strong> para pós-decremento e testar:</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\">void</span> <span class=\"token function\">exibirSequencia</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">int</span> numero<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>numero <span class=\"token operator\">==</span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <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>numero<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">exibirSequencia</span><span class=\"token punctuation\">(</span>numero<span class=\"token operator\">--</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Esse código irá executar várias vezes com o mesmo resultado mas em algum momento irá quebrar com o seguinte erro:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Exception <span class=\"token keyword\">in</span> thread <span class=\"token string\">\"main\"</span> java.lang.StackOverflowError</code></pre></div>\n<p>Por esses motivos é recomendado só usar recursão em casos pequenos ou fáceis de monitorar, pois algoritmos mais complexos podem causar erros que só podem ser percebidos posteriormente ou que são difíceis de entender.</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>Nesse artigo foi apresentado métodos, como criá-los e usá-los, também foi mostrado sobre assinatura de métodos, <strong>modificadores de acesso</strong>, <strong>retorno</strong> e <strong>parâmetros</strong>; aprendeu também sobre escopos e como o <strong>Java</strong> lida com blocos de contexto.</p>\n<p>E por fim também foi apresentado <strong>recursão</strong> que é uma ferramenta muito importante da linguagem mas que deve ser usada com cuidado para não gerar erros inesperados.</p>\n<p>No próximo artigo iremos entrar em Programação Orientada a Objetos.</p>\n<p>O código dos exemplos está 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-pt3/"},"frontmatter":{"date":"27 de setembro de 2021","description":"Métodos, escopo e recursão.","title":"Primeiros passos com Java III","tags":["Java","Beginner"],"author":"Guilherme Alves","image":{"id":"994a8b6f-97a8-5bed-854b-e22b0a5aa1fa","publicURL":"/static/861be214908a0c7970eaf606fbfb9cb0/ArtigoJavaIII.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB30lEQVQ4y4VTTXPiMAx1bOfbCSkQyhTaUmAI23aHCzvd6ZGe2kOB/v//8io5cdb7fdDYlqWnpydbyCCAs4BNCEiloQcX0FEMnSRQWQ4pJfxYPz5wezLhHH0QnVVZQcYJpA6hirItQneKQNUfgH0T/YECbRVOGlRtkcxYQMVF/gPkGIufA6Vlo6lFHcfEkFof1VDUugxEH2eZBvJ3qXyGvh5aKeg0s4maGGpTQHosg1/a93OFTzkKQ3sh/mEsTUjM+7NPyAHyRVmWuKgqLBYLbLdb1OMx5rMZvtD+ajrFfD7HNdntzQ0e7u+xWi4xmUz6VluWPOXuILsW1us1ju/v+P70hJfDAW+vr9jtdvi231vfgXzn85nuXqhYY8koeg3SadhTJUccRcjSFNPLSzSbDdarlWXB65RYFsbYta5rmDy3OVHzAFkN7T7wAZ12CU03ImA3zZB0/ZueORUo9s8ws2tEsiUlHJDq3mFRFBiNRhgOh9bGtGdtefJukhzLOXek98fphE3TwJiWseDAihJS+mKudfbFxJTZMkP//fGENRmDb0iW0/GIr4+PP7rk5AFNmJkZaoEtzzKrZUYr73PSK/N8CRW3P8t7So6M8DVRHbOUEh2QBe+Mgfi+b78z4a2foqg1JbCaguEAAAAASUVORK5CYII=","aspectRatio":1.4096916299559472,"src":"/static/861be214908a0c7970eaf606fbfb9cb0/0823f/ArtigoJavaIII.png","srcSet":"/static/861be214908a0c7970eaf606fbfb9cb0/c67b7/ArtigoJavaIII.png 320w,\n/static/861be214908a0c7970eaf606fbfb9cb0/d3930/ArtigoJavaIII.png 640w,\n/static/861be214908a0c7970eaf606fbfb9cb0/0823f/ArtigoJavaIII.png 1280w,\n/static/861be214908a0c7970eaf606fbfb9cb0/b3c49/ArtigoJavaIII.png 1745w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":8}},"pageContext":{"slug":"/java-iniciante-pt3/","previous":{"fields":{"slug":"/java-iniciante-pt2/"},"frontmatter":{"title":"Primeiros passos com Java II","date":"13 set, 2021"}},"next":{"fields":{"slug":"/java-iniciante-pt4/"},"frontmatter":{"title":"Primeiros passos com Java IV","date":"04 out, 2021"}}}},"staticQueryHashes":["63159454"]}