Declarando duas variáveis com o mesmo nome

(Última atualização em: 24 de fevereiro de 2016)

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:

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 trilha de certificação Java no Alura. Com 9 cursos preparatórios para a certificação da Oracle!

Content Editor at Alura and Software Developer

  • Leandro

    Muito bom 😀

    • Obrigado pelo comentário Leandro! Fico contente que tenha gostado 🙂

  • Bastante interessante, mas que usos poderíamos ter para shadowing?

    • Olá Lucas, tudo bem? Uma das utilidades que vejo no shadowing é a questão de você poder adicionar um setter com o mesmo nome, por exemplo:

       
      private long id;
      
      public void setId(long id) {
           this.id = id;
      }
      

      Além disso, quando você faz um método como por exemplo, observe esse método:

      private double valor;
      
      public void ajusteDePreco(double valor){
           this.valor += valor;
      }
      

      Se caso, você chamar esse método por meio de um auto-complete de uma IDE, como o eclipse, intellij entre outras. Automaticamente ele irá mostrar para você que se espera como parâmetro, nesse caso, uma variável que representa um valor, ou seja, deixa o método mais claro e intuitivo para qualquer um que chamá-lo, pois saberá que precisa mandar um valor! Mas vale ressaltar que o conteúdo apresentado no post é mais uma dica para quem está se preparando pra certificação da Oracle, pois nesse tópico a prova pode aparecer muitas pegadinhas quem induz ao erro 🙂

  • Muito bom. Já pensei em alguns cenários em que posso utilizar essa técnica.

    • Fico feliz que tenha gostado Bruno, você poderia compartilhar conosco qual foi a ideia que teve?

  • Bruno Silva

    É isso aí!

Próximo ArtigoExportando arquivos no After Effects pela primeira vez