{"componentChunkName":"component---src-templates-blog-post-js","path":"/java-iniciante-pt4/","result":{"data":{"markdownRemark":{"html":"<p>Nesse artigo chegamos a <strong>Orientação a Objetos</strong>, no últimos artigos foi mostrado a parte básica da linguagem e de sua sintaxe e agora será mostrado <strong>Classes</strong>, que sem isso não haveria <strong>Orientação a Objetos</strong> no <strong>Java</strong>, também será mostrado <strong>Encapsulamento</strong> e como ele é importante na linguagem.</p>\n<h1 id=\"Orientacao-a-Objetos\" style=\"position:relative;\">Orientação a Objetos<a href=\"#Orientacao-a-Objetos\" aria-label=\"Orientacao a Objetos 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></h1>\n<p>Antes de iniciarmos qualquer explicação sobre <strong>Classes</strong> é necessário entender o que é <strong>Orientação a Objetos</strong> e como esse paradigma é tratado no <strong>Java</strong>. Antes de existir a <strong>Orientação a Objetos</strong> o paradigma que dominava o mercado era o paradigma procedural, e resumidamente esse paradigma é sobre escrever métodos ou <strong>procedimentos</strong> que deveriam ser executados no código enquanto que <strong>Orientação a Objetos</strong> consiste em criação de <strong>Objetos</strong> que contém tanto <strong>métodos</strong> quanto <strong>atributos</strong>, que são dados referentes aquele <strong>Objeto</strong>.</p>\n<p>O paradigma orientado a objetos trás consigo quatro fundamentos básicos que o torna diferente do paradigma procedural:</p>\n<ul>\n<li>Abstração</li>\n<li>Encapsulamento</li>\n<li>Herança</li>\n<li>Polimorfismo</li>\n</ul>\n<p>Iremos tratar de cada um desses temas nos próximos artigos.</p>\n<h2 id=\"Classe\" style=\"position:relative;\">Classe<a href=\"#Classe\" aria-label=\"Classe 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>Para entender um <strong>Objeto</strong> é mais fácil explicar o que é uma <strong>Classe</strong> já que a classe seria o “molde” para um objeto. Para entender melhor vamos pensar em um sistema de Recursos Humanos onde temos o cadastro de <strong>Funcionários</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\">Funcionario</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> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> departamento<span class=\"token punctuation\">;</span>\n    \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Daqui a pouco será explicado o que são as palavras <strong>public</strong> e <strong>private</strong> mas por enquanto iremos focar na declaração da <strong>classe</strong> e seus <strong>atributos</strong>. No código acima foi criada a <strong>classe</strong> Funcionário e não um <strong>objeto</strong> Funcionario mas o que isso significa? Significa que foi criado um “molde” ou um “esqueleto” do que é um funcionário para o nosso código, foi definido que todo <strong>Funcionário</strong> possui um <strong>nome</strong> e <strong>sobrenome</strong>, uma <strong>idade</strong>, um <strong>endereço</strong> e um <strong>departamento</strong> mas ainda não foi criado nenhum funcionário no sistema.</p>\n<p>Antes de ver como criar um <strong>objeto</strong> do tipo <strong>Funcionário</strong> veremos a sintaxe de uma classe:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">NomeDaClasse</span> <span class=\"token punctuation\">{</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essa é sintaxe mais básica para existir uma classe, é necessária a palavra reservada <strong>class</strong>, no nome seguimos o padrão <strong>camel case</strong> seguido de chaves <strong>{}</strong>.</p>\n<p>Os dados da <strong>classe Funcionário</strong> são chamados de <strong>atributos</strong> e possuem e sintaxe básica assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n<span class=\"token class-name\">String</span> departamento<span class=\"token punctuation\">;</span></code></pre></div>\n<p>É necessário informar qual é o tipo que representa esse <strong>atributo</strong> no <strong>Java</strong> então temos o primeiro <strong>atributo</strong> (nome) do tipo <strong>String</strong> (texto), idade do tipo <strong>int</strong>, numérico e etc. A palavra reservada <strong>private</strong> não é obrigatória porém será entendida mais adiante nesse artigo quando for explicado sobre <strong>Encapsulamento</strong>.</p>\n<p>Para criar um <strong>Objeto</strong> no <strong>Java</strong> é usado a palavra reservada <strong>new</strong>, que irá criar um <strong>Objeto</strong> na memória e será possível manipular dados desse objeto:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Funcionario</span> funcionario <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Pronto, só com isso já temos em mãos um objeto do tipo <strong>Funcionario</strong>, também é possível fazer dessa forma:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token keyword\">var</span> funcionario <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Como foi dito em artigos anteriores o <strong>Java</strong> agora é capaz de realizar inferência de tipos, que é capacidade de “saber” qual é o tipo de uma variável mesmo sem declarar explicitamente o seu tipo, como no caso do código acima onde foi criado um objeto do tipo Funcionário e passado para a variável <strong>var funcionario</strong> sem dizer qual é o seu tipo, o compilador consegue entender que aquela variável é do tipo Funcionario.</p>\n<p>Um ponto importante é que foi necessário colocar parenteses <strong>()</strong> após a palavra <strong>new</strong>, isso acontece pois <strong>Funcionario()</strong> é um método. Um método especial do <strong>Java</strong> que se chama <strong>Construtor</strong> e ele é responsável pela inicialização dos <strong>objetos</strong>, por padrão toda <strong>classe</strong> no <strong>Java</strong> possui um método construtor sem argumentos então seria como se a <strong>classe Funcionario</strong> fosse assim:</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\">Funcionario</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">{</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> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> departamento<span class=\"token punctuation\">;</span>\n    \n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O método construtor é um método que tem o mesmo nome da <strong>classe</strong> e não possui um retorno em sua assinatura e com ele conseguimos criar os objetos.</p>\n<p>Agora já sabemos como criar objetos, mas o objeto <strong>Funcionario</strong> possui atributos que não foram preenchidos, como nome, idade, endereço e departamento. Para lidar com isso é possível criar um método <strong>construtor</strong> onde passamos esses atributos:</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\">Funcionario</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> departamento<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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>idade <span class=\"token operator\">=</span> idade<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endereco <span class=\"token operator\">=</span> endereco<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>departamento <span class=\"token operator\">=</span> departamento<span class=\"token punctuation\">;</span>\n    <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> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> departamento<span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Modificamos o método construtor de <strong>Funcionario</strong> e agora ele recebe todos os dados, porém agora se tentarmos rodar o código como estava antes ele não irá compilar:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Funcionario</span> funcionario <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token string\">'Funcionario(java.lang.String, java.lang.String, int, java.lang.String, java.lang.String)'</span> <span class=\"token keyword\">in</span> <span class=\"token string\">'br.com.company.artigoiv.Funcionario'</span> cannot be applied to <span class=\"token string\">'()'</span></code></pre></div>\n<p>Isso ocorre pois quando explicitamente escrevemos um método construtor o método construtor padrão deixa de existir se por acaso quiséssemos ter os dois construtores, nós podemos mas é necessário escrever isso no código:</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\">Funcionario</span> <span class=\"token punctuation\">{</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> departamento<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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>idade <span class=\"token operator\">=</span> idade<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endereco <span class=\"token operator\">=</span> endereco<span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>departamento <span class=\"token operator\">=</span> departamento<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Inclusive podemos ter quantos métodos construtores forem necessários porém não é uma boa prática ter muitos métodos construtores, em casos que seja necessário existem outras abordagens e padrões como o <strong>Builder</strong>.</p>\n<p>Outro ponto que é bom mostrar é que dentro do construtor criado foi usado a palavra <strong>this</strong>. Entender isso é de grande importância pois o <strong>this</strong> no <strong>Java</strong> faz referência a própria classe, é ela se auto referenciando e aqui no construtor isso é importante pois as variáveis que são passadas nos argumentos do construtor possuem o mesmo nome das <strong>atributos</strong> e para saber em qual variável será guardado o valor o <strong>this</strong> nos auxilia:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><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> sobrenome<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">private</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">private</span> <span class=\"token class-name\">String</span> departamento<span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> departamento<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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>idade <span class=\"token operator\">=</span> idade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endereco <span class=\"token operator\">=</span> endereco<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>departamento <span class=\"token operator\">=</span> departamento<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O <strong>this.nome</strong> dentro do construtor significa que ela se refere a variável <strong>nome</strong> da classe <strong>Funcionario</strong> e não a variável <strong>nome</strong> do método construtor, se por acaso você retirar o <strong>this</strong> a variável <strong>nome</strong> da classe <strong>Funcionario</strong> não receberá valor e na verdade você estará reatribuindo o valor da variável <strong>nome</strong> do método construtor para ela mesma. Então conseguimos ver o significado do <strong>this</strong> dentro de uma classe, sempre que houver <strong>this</strong> dentro de uma classe significa que está ocorrendo uma referência para ela mesma.</p>\n<p>Uma classe também pode ter métodos, o que faz muito sentido pois uma classe que somente tenha <strong>atributos</strong> não teria conseguiria executar muita coisa dentro do seu código ela serviria como uma objeto de transporte de dados talvez, existe um padrão chamado <strong>DTO</strong> onde as classes executam esse papel de transporte de dados mas podemos fazer mais com as classes quando adicionamos métodos a elas. Na classe <strong>Funcionario</strong> podemos adicionar um método para exibir o nome completo de um funcionário:</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\">nomeCompleto</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 keyword\">this</span><span class=\"token punctuation\">.</span>nome <span class=\"token operator\">+</span> <span class=\"token string\">\" \"</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sobrenome<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>O método <strong>nomeCompleto</strong> retorna uma <strong>String</strong> que é a junção, usamos o termo concatenação nesses casos, do valor da variável <strong>nome</strong>, uma <strong>String</strong> vazia para fazer o espaço e o valor da variável <strong>sobrenome</strong>, se executarmos o programa teremos o resultado:</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\">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\">Funcionario</span> funcionario <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Alves\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"São Paulo\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Desenvolvimento\"</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>funcionario<span class=\"token punctuation\">.</span><span class=\"token function\">nomeCompleto</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Resultado:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Guilherme Alves</code></pre></div>\n<p>Então no código acima foi criado um objeto do tipo <strong>Funcionario</strong>, usando o método construtor para adicionar valores a ele, atribuído esse objeto para a variável <strong>funcionario</strong> e executado o método <strong>nomeCompleto</strong>. Dois pontos são importantes de serem analisados no código acima, o primeiro é que para executarmos um método de uma classe ou até mesmo para acessar os atributos de uma classe usamos o <strong>.</strong> (ponto) que nesse caso serve como operador de acesso aos elementos de uma classe, então nesse caso foi usado o operador <strong>.</strong> (ponto) para acessar e executar o método <strong>nomeCompleto</strong> e o segundo ponto que talvez não possa ter ficado claro é que quando criamos um objeto no <strong>Java</strong> estamos criando algo que é único, por mais que eu possa criar vários objetos do tipo <strong>Funcionario</strong> com os mesmos valores eles serão objetos diferentes para o <strong>Java</strong> pois serão criados e alocados em diferentes espaços de memória, para ficar claro vamos criar dois objetos com os mesmos dados e fazer uma comparação entre eles:</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\">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\">Funcionario</span> funcionario <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Alves\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"São Paulo\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Desenvolvimento\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">Funcionario</span> funcionarioII <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Guilherme\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Alves\"</span><span class=\"token punctuation\">,</span> <span class=\"token number\">35</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"São Paulo\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"Desenvolvimento\"</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>funcionario<span class=\"token punctuation\">.</span><span class=\"token function\">equals</span><span class=\"token punctuation\">(</span>funcionarioII<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>funcionario<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</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>funcionarioII<span class=\"token punctuation\">.</span><span class=\"token function\">toString</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Criamos dois objetos do tipo <strong>Funcionario</strong> e usamos o método <strong>equals</strong>, logo falaremos sobre ele, para saber se os objetos são iguais, logo após foi executado o método <strong>toString</strong>, também falaremos sobre ele, para imprimir na tela o valor textual desses objetos, o resultado foi:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\"><span class=\"token boolean\">false</span>\nbr.com.company.artigoiv.Funcionario@27f674d\nbr.com.company.artigoiv.Funcionario@1d251891</code></pre></div>\n<p>O resultado foi <strong>false</strong> para a verificação de igualdade entre os objetos; o resultado irá variar em cada computador pois o método <strong>toString</strong> do jeito que está agora exibe o nome da classe completo mais o valor hexadecimal que representa o endereço de memória onde está o objeto e podemos entender que apesar de terem os mesmos valores esses objetos estão em endereços de memória diferentes.</p>\n<p>Aproveitando o assunto de classes, no artigo anterior foi comentado sobre o modificador <strong>static</strong> e que ao usá-lo o atributo ou método passa a pertencer a classe e não mais uma instância, vamos entender um pouco melhor o que isso significa.</p>\n<p>Vamos imaginar que todo funcionário possua um <strong>CPF</strong>, é só um exemplo hipotético para explicar o conceito de <strong>static</strong>, então como todo funcionário possui esse atributo poderíamos deixar esse tipo de documento como sendo uma constante:</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\">static</span> <span class=\"token keyword\">final</span> <span class=\"token class-name\">String</span> TIPO_DOCUMENTO <span class=\"token operator\">=</span> <span class=\"token string\">\"CPF\"</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>E podemos usar essa constante em qualquer lugar sem ter a necessidade de ter uma instância de <strong>Funcionario</strong> para funcionar:</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\">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\">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 tipo de documento de todo funcionario é o \"</span> <span class=\"token operator\">+</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">.</span>TIPO_DOCUMENTO<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Bastando importar essa constante diretamente a partir da classe <strong>Funcionario</strong> e o mesmo é válido para métodos que também podem ser estáticos, em casos onde algum comportamento independa de um objeto criado, para esse exemplo vamos criar um método estático dessa mensagem que imprimimos na tela:</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\">Funcionario</span> <span class=\"token punctuation\">{</span>\n\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_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 keyword\">static</span> <span class=\"token class-name\">String</span> <span class=\"token function\">imprimeTipoDeDocumentoDosFuncionarios</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\">\"O tipo de documento de todo funcionario é o \"</span> <span class=\"token operator\">+</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">.</span>TIPO_DOCUMENTO<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>E para usar:</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\">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\">Funcionario</span><span class=\"token punctuation\">.</span><span class=\"token function\">imprimeTipoDeDocumentoDosFuncionarios</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Da mesma forma como foi feito com a constante, não é necessário existir uma instância de <strong>Funcionario</strong> para esse método funcionar.</p>\n<h2 id=\"Encapsulamento\" style=\"position:relative;\">Encapsulamento<a href=\"#Encapsulamento\" aria-label=\"Encapsulamento 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>Após essa introdução às classes, construtores e atributos já é possível entender que uma classe é um container que guarda <strong>atributos</strong> (dados) sobre um determinado assunto, no nosso exemplo dados de um <strong>Funcionário</strong> e métodos (ações) que podemos executar a partir de uma instância de um objeto.</p>\n<p>No exemplo anterior foi criado um objeto <strong>Funcionario</strong> usando o construtor e passando todos os dados de um funcionário, porém nem sempre isso está disponível, pense em um empresa onde na contratação de um funcionário ele pode enviar depois alguns documentos como o comprovante de endereço por exemplo e nesse caso o que poderíamos fazer?</p>\n<p>Podemos criar mais um construtor sem o <strong>atributo</strong> endereço por exemplo, mas já temos dois construtores criados e o nosso código pode ficar poluído. Existia um padrão que era chamado de <strong>Construtor Telescópio</strong> que consistia em criar vários construtores começando desde o construtor sem argumentos e aumentando até o construtor com todos os argumentos, no nosso código ficaria assim:</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\">Funcionario</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\">Funcionario</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>nome <span class=\"token operator\">=</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\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<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 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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>idade <span class=\"token operator\">=</span> idade<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> endereco<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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>idade <span class=\"token operator\">=</span> idade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endereco <span class=\"token operator\">=</span> endereco<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> nome<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">,</span> <span class=\"token keyword\">int</span> idade<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> endereco<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> departamento<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>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>idade <span class=\"token operator\">=</span> idade<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>endereco <span class=\"token operator\">=</span> endereco<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>departamento <span class=\"token operator\">=</span> departamento<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>A classe <strong>Funcionario</strong> está ficando cada vez maior e até o momento só temos um método, se essa classe adicionar mais um <strong>atributo</strong> terá que acrescentar mais um construtor e quando tiver mais métodos a leitura e o entendimento vão ficar muito difíceis por conta de um código que só existe para criar um objeto. Então você pode perceber que esse padrão não é mais usado, mas agora ainda temos que resolver o problema de como criar um objeto <strong>Funcionario</strong> sem o endereço ou outros dados e depois adicioná-los.</p>\n<p>Podemos criar um objeto <strong>Funcionario</strong> com o construtor padrão e depois atribuir os valores a ele:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Funcionario</span> funcionarioIII <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nfuncionarioIII<span class=\"token punctuation\">.</span>nome <span class=\"token operator\">=</span> <span class=\"token string\">\"Jose\"</span><span class=\"token punctuation\">;</span>\nfuncionarioIII<span class=\"token punctuation\">.</span>sobrenome <span class=\"token operator\">=</span> <span class=\"token string\">\"Alves\"</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Se você tentou fazer isso percebeu que esse código não compila pois o atributo <strong>nome</strong> e <strong>sobrenome</strong> não são acessíveis. Mas por que isso acontece?  Isso se deve ao fato de que na classe <strong>Funcionario</strong> os atributos estão com o modificador de acesso <strong>private</strong> tornando-os inacessíveis para outras classes.</p>\n<p>Isso significa que ler esses atributos agora também se tornou impossível:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><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>funcionarioIII<span class=\"token punctuation\">.</span>nome<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Esse código também não compila pelo mesmo motivo. Mas como poderemos trabalhar com os atributos e por que usar o modificador <strong>private</strong> para deixar os atributos inacessíveis?</p>\n<p>Antes de mais nada vamos pensar que estamos trabalhando em uma grande equipe e que hoje escrevemos esse código e que não foi colocado o modificador <strong>private</strong> e depois de um tempo outro desenvolvedor sem saber muito bem as regras de um funcionário no sistema de RH modifica o código que atribui o nome a um funcionário e faz algo assim:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Funcionario</span> funcionarioIII <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nfuncionarioIII<span class=\"token punctuation\">.</span>nome <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O código vai continuar compilando e vai executar sem dar algum problema visível porém estará com uma falha pois agora o nome do funcionário é <strong>null</strong>. Para impedir esse tipo comportamento de acessar diretamente dados de uma classe é que o <strong>encapsulamento</strong> foi pensado.</p>\n<p>Mas nesses casos como poderá ser resolvido o problema de acesso as variáveis pois é necessário adicionar ou ler valores na classe <strong>Funcionario</strong>?</p>\n<p>Para esses casos existem dois métodos especiais que nos auxiliam que são os chamados métodos <strong>getters</strong> e <strong>setters</strong>, onde o <strong>get</strong> é usado para leitura de dados e o <strong>set</strong> para adição de valores, então o código da classe <strong>Funcionario</strong> ficaria assim:</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\">Funcionario</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> sobrenome<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 keyword\">void</span> <span class=\"token function\">setNome</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>nome <span class=\"token operator\">=</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\">String</span> <span class=\"token function\">getSobrenome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">return</span> sobrenome<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\">setSobrenome</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">String</span> sobrenome<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>sobrenome <span class=\"token operator\">=</span> sobrenome<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>No código acima voltamos o modificador <strong>private</strong> e foi adicionado os métodos <strong>get</strong> e <strong>set</strong> para cada atributo; o método <strong>getNome</strong> oferece acesso ao valor do atributo <strong>nome</strong> e método <strong>setNome</strong> recebe uma <strong>String</strong> e atribui o seu valor para a variável <strong>nome</strong> da classe, isso já cria uma camada sobre os atributos mas aparentemente nós só movemos o comportamento de ler/adicionar valores para uma complexidade maior porém existe uma vantagem aqui que nem sempre é compreendida, nós conseguimos através dessa camada bloquear ou validar informações de entrada ou saída como no exemplo a seguir:</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\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span><span class=\"token punctuation\">(</span>nome <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> nome<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> nome<span class=\"token punctuation\">.</span><span class=\"token function\">isBlank</span><span class=\"token punctuation\">(</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 do nome não foi preenchido\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">\"\"</span><span class=\"token punctuation\">;</span>\n    <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 keyword\">void</span> <span class=\"token function\">setNome</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\">if</span><span class=\"token punctuation\">(</span>nome <span class=\"token operator\">==</span> <span class=\"token keyword\">null</span> <span class=\"token operator\">||</span> nome<span class=\"token punctuation\">.</span><span class=\"token function\">isEmpty</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> nome<span class=\"token punctuation\">.</span><span class=\"token function\">isBlank</span><span class=\"token punctuation\">(</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 deve ser preenchido\"</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    <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></code></pre></div>\n<p>Foi feita uma validação prévia tanto na entrada como na leitura dos dados e para usar essa nova abordagem podemos fazer da seguinte maneira:</p>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\"><span class=\"token class-name\">Funcionario</span> funcionarioIII <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">Funcionario</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nfuncionarioIII<span class=\"token punctuation\">.</span><span class=\"token function\">setNome</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</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>funcionarioIII<span class=\"token punctuation\">.</span><span class=\"token function\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nfuncionarioIII<span class=\"token punctuation\">.</span><span class=\"token function\">setNome</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\">System</span><span class=\"token punctuation\">.</span>out<span class=\"token punctuation\">.</span><span class=\"token function\">println</span><span class=\"token punctuation\">(</span>funcionarioIII<span class=\"token punctuation\">.</span><span class=\"token function\">getNome</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>No codigo acima criamos uma instância de <strong>Funcionario</strong> e atribuímos a variável <strong>funcionarioIII</strong>, depois usamos o método <strong>setNome</strong> porém passando <strong>null</strong>, após isso usamos o método <strong>getNome</strong> para imprimir na tela o valor que nome possui, e por fim usamos novamente o método <strong>setNome</strong> porém agora passando um valor real e novamente usamos o <strong>getNome</strong> para recuperar o seu valor. O resultado é:</p>\n<div class=\"gatsby-highlight\" data-language=\"bash\"><pre class=\"language-bash\"><code class=\"language-bash\">Valor deve ser preenchido\nValor <span class=\"token keyword\">do</span> nome não foi preenchido\n\nGuilherme</code></pre></div>\n<p>Então foi possível um certo nível de proteção aos dados da classe <strong>Funcionario</strong>. Então com <strong>encapsulamento</strong> podemos ver que temos como proteger e controlar melhor os atributos dentro de uma classe, também existe uma flexibilidade maior caso quiséssemos deixar os valores impedidos de ser escritos, pois poderíamos facilmente retirar os métodos <strong>setters</strong> e deixar para atribuição de valores apenas no momento da criação da classe através do <strong>construtor</strong> do objeto e ter os atributos como apenas leitura que é um conceito muito utilizado quando é pensado em objetos imutáveis.</p>\n<p>Existem outros modificadores de acesso que são tanto utilizados para controle de acesso quanto para outros comportamentos e irei citá-los aqui porém serão vistos com mais profundidade em outros assuntos mais pra frente:</p>\n<ul>\n<li><strong>public</strong>: Esse modificador já vimos tanto nas classes, métodos e atributos, quando algo é marcado com esse modificador tem o seu escopo mais abrangente podendo ser usado em todos pacotes ou lugares do código.</li>\n<li><strong>protected</strong>: Com esse modificador o atributo ou método só será visível em suas <strong>subclasses</strong>, será visto quando for falado sobre <strong>Herança</strong>.</li>\n<li><strong>default</strong>: Quando usado esse modificador o código só é acessível dentro do seu próprio pacote. Para usar esse modificador basta deixar sem nenhuma palavra reservada antes da classe, método ou atributo, se tentar um código <strong>default</strong> em outro pacote irá ocorrer o mesmo erro de compilação de quando tentamos acessar um atributo <strong>private</strong>.</li>\n</ul>\n<p>Outros modificadores, que alguns já fora abordados, são:</p>\n<ul>\n<li><strong>final</strong>: Quando utilizado em classes significa que esta não pode ser herdada por outras classes; quando usado em métodos ou atributos significa que os mesmos não podem ser sobrescritos.</li>\n<li><strong>abstract</strong>: Quando utilizado em classes significa que esta classe é uma <strong>Classe Abstrata</strong>, um tipo diferente de classe que veremos mais a frente; quando utilizada em métodos dentro de uma <strong>Classe Abstrata</strong> é para que sua implementação seja realizada na <strong>subclasse</strong>.</li>\n<li><strong>static</strong>: Utilizado em métodos ou atributos que são pertencentes a classe e não a instância.</li>\n<li><strong>transient</strong>: Utilizado em métodos ou atributos faz com que não sejam serializados. Utilizado em alguns casos no contexto de envio de informações para banco de dados onde alguns atributos não devem ser persistidos, mas não se preocupe com isso agora pois mesmo a sua utilização não é tão frequente.</li>\n<li><strong>synchronized</strong>: Utilizados em métodos quando escrevemos códigos de acesso paralelo, mas novamente não muito utilizado.</li>\n</ul>\n<h1 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></h1>\n<p>Vimos nesse artigo como criar e usar classes, desde a sua sintaxe até como proteger dados com encapsulamento. Vimos que criar métodos <strong>getters/setters</strong> acaba deixando um voluma alto de código que é usado apenas para cumprir com requisitos da linguagem mas sem lógica para o problema que desejamos resolver, chamados de códigos <strong>boilerplate</strong>, porém existe hoje muitas ferramentas que auxiliam o desenvolvedor nesse aspecto, as próprias <strong>IDEs</strong> ajudam muito na geração automática desse código, como é o caso do <strong>IntelliJ</strong>, <strong>Eclipse</strong> ou <strong>VSCode</strong>, porém existem bibliotecas escritas no <strong>Java</strong> que foram feitas para nos ajudar como é o caso do projeto <a href=\"https://projectlombok.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Lombok</a>.</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-pt4/"},"frontmatter":{"date":"04 de outubro de 2021","description":"POO Classes e Encapsulamento","title":"Primeiros passos com Java IV","tags":["Java","Beginner","POO"],"author":"Guilherme Alves","image":{"id":"166261ce-1a34-5558-92d0-dafa0efaae01","publicURL":"/static/eafe4763cc54cfd8dbcfc211479c08c2/java-artigoIV.png","childImageSharp":{"fluid":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB10lEQVQ4y4VTyXIaMRDVNvvCDGFxSIixywzGkAspL8mF4soF5/8/5qVbSBOZctmHLrWk7qf3Xs8IJSV8SA4hoIyBGbQwcQKTptB5AaUUwtqwXvqcQviDvkhI6LqBSlICjqCr+vwI3WkC1e8AhyH6DRXaV7hp0JxBitICaso/A+oB3xYqC2RIIstlhubLGJpzKfo6y1SqC+lO8nt+GK1hstw2GmJoygoqYCkv5Ie9IqQbR5G9EB8E10U0tHCvwqFY3XRR1zXapsHNYoHtZoPpZIIf8znW6zW+zWaYU86xuL7Gz+0W3XKJCdX4gXmWwiMrJ2F5d4fD4YDdbof9fo/j8YjNwwN+0f73y4u947Pnpyes7+8tGU1eKwfcA/JFHMco8rN30+kU4/HYrl+vriz7QT3AaDRCURS95Gi1gWqGNpchoPcuTRLkBMo+ReQpr96WSy+LskT1+Afl7Dti5Wo8kHbfYVVVGA6HaNvWBjNidpom7yfJtdxzS37/fX1Ft1qh9Kz5E2moIaNfzEvns4SYcjDL8PvjvSHWDN51HU6nkx1ir5KbecLMrCQJHOxj7oJz9szus8yuKT2uHEsr36lz+/++aMcso8bCgwXgDJTQ4IyX7wfhcl7/AUZSM9BnY+4fAAAAAElFTkSuQmCC","aspectRatio":1.4096916299559472,"src":"/static/eafe4763cc54cfd8dbcfc211479c08c2/0823f/java-artigoIV.png","srcSet":"/static/eafe4763cc54cfd8dbcfc211479c08c2/c67b7/java-artigoIV.png 320w,\n/static/eafe4763cc54cfd8dbcfc211479c08c2/d3930/java-artigoIV.png 640w,\n/static/eafe4763cc54cfd8dbcfc211479c08c2/0823f/java-artigoIV.png 1280w,\n/static/eafe4763cc54cfd8dbcfc211479c08c2/cec22/java-artigoIV.png 1746w","sizes":"(max-width: 1280px) 100vw, 1280px"}}}},"timeToRead":15}},"pageContext":{"slug":"/java-iniciante-pt4/","previous":{"fields":{"slug":"/java-iniciante-pt3/"},"frontmatter":{"title":"Primeiros passos com Java III","date":"27 set, 2021"}},"next":{"fields":{"slug":"/java-iniciante-pt5/"},"frontmatter":{"title":"Primeiros passos com Java V","date":"13 out, 2021"}}}},"staticQueryHashes":["63159454"]}