Declarando duas variáveis com o mesmo nome

Declarando duas variáveis com o mesmo nome

Estou me preparando para a certificação da Oracle e surgiu o seguinte cenário: posso declarar variáveis com o mesmo nome na mesma classe? Vamos verificar a classe Livro:


public class Livro {

private double preco = 10; 
public double calculaImposto(){ 
    return preco; }

//métodos...

}

Testando minha classe:

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

Livro l = new Livro(); 
System.out.println("Imposto do livro: " + l.calculaImposto());

O resultado é o esperado:

 > Imposto do livro: 10.0

O método calculaImposto() sofreu um pequeno ajuste e agora ele mesmo define o valor padrão do imposto:


//código

private double preco = 10;

public double calculaImposto(){ 
    double preco = 12.30; 
    return preco; }

Espera aí! Duas variáveis com o mesmo nome? Pode isso? Qual valor será retornado? Testando a classe:

 > Imposto do livro: 12.3

Como podemos ver, a variável membro preco não foi retornada, declaramos uma variável local com o mesmo nome, por isso o calculaImposto() deu prioridade para a variável com valor 12.3 e a retornou. A capacidade de esconder uma variável membro é uma técnica conhecida como shadowing. Poderíamos, também, enviar um parâmetro com o mesmo nome:


//código

private double preco = 10;

public double calculaImposto(double preco){ 
    return preco; }

Modificamos a chamada do calculaImposto() para enviar um double:


System.out.println("Imposto do livro: l.calculaImposto(15.5));

Verificando o resultado:

 > Imposto do livro: 15.5

Muito bom, mas... E se e eu quiser retornar o valor da variável membro? É simples, basta utilizar a palavra chave this:


private double preco = 10;
public double calculaImposto(double preco){
     return this.preco; }

Imprimindo o resultado:

 > Imposto do livro: 10.0

Veja que agora o valor retornado foi o da variável membro, ou seja, o atributo da classe!

Agora já sabe como lidar com variáveis locais e membros? Gostou do shadowing? Quer aprender mais dicas e nunca mais cair em pegadinhas no Java? Pensando nisso, o instrutor Guilherme Silveira, criou a Formação Java na Alura.

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Criador de mais de 40 cursos, como Kotlin, Flutter, Android, persistência de dados, comunicação com Web API, personalização de telas, testes automatizados, arquitetura de Apps e Firebase. É expert em Programação Orientada a Objetos, visando sempre compartilhar as boas práticas e tendências do mercado de desenvolvimento de software. Atuou 2 anos como editor de conteúdo no blog da Alura e hoje ainda escreve artigos técnicos.

Veja outros artigos sobre Programação