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 promoção da black friday, com os dizeres: A Black Friday Alura está chegando. Faça parte da Lista VIP, receba o maior desconto do ano em primeira mão e garanta bônus exclusivos. Quero ser VIP

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. Atualmente cria conteúdo no canal https://www.youtube.com/@AlexFelipeDev.

Veja outros artigos sobre Programação