Declarando duas variáveis com o mesmo nome

(Last Updated On: 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!

FIQUE POR DENTRO

Content Editor at Alura and Software Developer

Próximo ArtigoExportando arquivos no After Effects pela primeira vez