Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Dúvida sobre uso do "super."

Boa tarde!

O código abaixo, da subclasse ContaPoupanca do exemplo usa o this.getSaldo(), mesmo o método sendo escrito na superclasse Conta:

  public void calcularJuros() {
    double juros = this.getSaldo() * taxaDeJuros;
    System.out.println("Juros atual: " +juros);
  }

Portanto, minha dúvida é: o uso do "super." para se referir a um método da superclasse é apenas em casos de sobrescrita @Override do método?

2 respostas
solução!

Boa noite!

Repare nesse código:

public class Conta {

    private double saldo;

    public double getSaldo(){
        System.out.println("Metodo da superclasse");
        return saldo;
    }
}
public class ContaPoupanca extends Conta {

    @Override
    public double getSaldo() {
        //this.getSaldo();
        return super.getSaldo();
    }

    public void calcularJuros(){
        this.getSaldo();
        super.getSaldo();
    }

}
public class Main {
    public static void main(String[] args) {

        ContaPoupanca conta = new ContaPoupanca();
        conta.getSaldo();
        conta.calcularJuros();
    }
}

O resultado após rodar o método main vai ser:

  • Metodo da superclasse
  • Metodo da superclasse
  • Metodo da superclasse

Isso acontece porque quando você chama o método getSaldo() com super dentro de um método @Override, ele vai chamar o método da superclasse. Se você chamar getSaldo() com this em um método que não é sobrescrito, ele ainda sim vai chamar o método da superclasse. Se você chama o getSaldo() com super dentro de um método que não é @Override ele ainda sim vai chamar o método da superclasse.

Repare que comentei uma linha do método getSaldo() da classe ContaPoupança, isso foi para evitar um ciclo infinito de chamadas até estourar uma exception, porque nesse caso, o método this.getSaldo() em um método @Override estaria chamando ele mesmo.

Respondendo a sua pergunta: Não, você pode chamar um método da superclasse usando super mesmo em um método que não é @Override.

Perfeito! Muito obrigado pela resposta, adorei o exemplo e consegui abstrair melhor a respeito do uso do super.

Por exemplo:

public class Conta {

    private double saldo;

    public double getSaldo(){
        System.out.println("Metodo da superclasse");
        return saldo;
    }
}

public class ContaPoupanca extends Conta {



    @Override
    public double getSaldo() {
        System.out.println("Método da subclasse);
        return saldo;
    }

    public void calcularJuros(){
        //Nesse caso, eu estaria utilizando o método @Override:
        //this.getSaldo(); 
        //"Nesse caso, eu utilizarei o método da superclasse:
        super.getSaldo(); 
    }

}

Ou seja, mesmo o método calcularJuros() não sendo um @Override, ainda sim eu poderia utilizar o super.getSaldo(), caso a ideia seja utilizar o método da superclasse, correto?

Agradeço a atenção e desejo um Feliz Ano Novo!