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:
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.