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

This ou Super

Me desculpem se for uma pergunta "boba" rs, mas, porque devemos usar o this(como visto anteriormente o this é opcional) na mesma classe, sendo que quando extends da classe mãe, nos devemos usar o super, fiquei meio confuso, até mesmo na hora de fazer essa pergunta. Seria boa pratica usar o super? apenas isso?

5 respostas
solução!

Oi Leandro, super só quando for chamar um método da classe mãe caso esteja usando herança. Ok? O this é opcional, mas é sempre uma boa prática. this evita conflito entre nomes de variáveis que se referem ao parâmetro e/ou o atributo da classe.

Ficou mais claro?

Oi Leandro,

Nenhuma pergunta é boba. Fique sempre a vontade para perguntar qualquer coisa que não tenha entendido ou que não tenha ficado claro :)

O this é utilizado para indicar algum atributo ou método da própria classe. Dependendo do caso ele pode ser opcional. Por exemplo, imagine que você tem a seguinte classe:

public class Investimento {

    private String cliente;
    private double valor;

    public double calcularRendimento() {
        double taxa = 0.03;
        return this.valor * taxa;
    }
}

Olhando para o return no método calcularRendimento(), o this nesse caso é opicional, pois o método não tem parametros com o mesmo nome do atributo.

Mas se o método fosse assim:

public double calcularRendimento(double valor) {
    double taxa = 0.03;
    return (this.valor + valor) * taxa;
}

Agora o this é obrigatório, pois dentro do método quando você escrever valor o Java não tem como saber se você está falando do parâmetro do método que chama valor, ou do atributo da classe que também se chama valor.

Nesse caso sem o this, você está falando do parâmetro, e com o this está falando do atributo.

Agora sobre o super, ele somente é usado em caso de herança. Vamos a um exemplo:

public class Conta {
    protected double saldo;

    public void depositar(double valor) {
        this.saldo += valor;
    }
}

public class Poupanca extends Conta {
    public void depositar(double valor) {
        double juros = 0.10;
        this.saldo -= juros;
        this.saldo += valor;
    }
}

No meu exemplo, a classe Poupanca sobrescreveu completamente o método depositar que foi herdado da classe Conta. Como é uma sobrescrita, o Java sempre chamará o método depositar da classe Poupanca, e não mais o da classe Conta.

Mas imagine que não queremos modificar completamente o método depoistar, mas apenas fazer um complemento em relação ao que é feito no método depoistar da classe Conta. Nesse caso, como podemos fazer para reaproveitar o código do método depositar da classe Conta(reaproveitando o que jaá existe nele), e após isso fazendo o complemento ?

É aí que entra o super:

public void depositar(double valor) {
    super(valor);
    double juros = 0.10;
    this.saldo -= juros;
}

O que o super faz nesse caso é chamar o método depositar da classe Conta.

Com isso podemos evitar duplicar o código que já existe no método depositar da classe conta, no método depositar da classe Poupanca.

Faz sentido?

Bons estudos!

Ah, agora ficou 100% claro pra mim :) muito obrigado vocês são top.

"É aí que entra o super:

public void depositar(double valor) {
    super(valor);
    double juros = 0.10;
    this.saldo -= juros;
}

O que o super faz nesse caso é chamar o método depositar da classe Conta.

Com isso podemos evitar duplicar o código que já existe no método depositar da classe conta, no método depositar da classe Poupanca."

=========================================

Poderiam, explicar essa parte novamente por favor!?. Pois eu não entendi como o "super", chamaria o método "depositar da classe Conta". Já que está apenas "super(valor); " (aliás o que isso significa?), dentro do método "depositar".

Oi Robson,

Quando você coloca super dentro de um método, o Java automaticamente sabe que é para chamar o mesmo método só que na classe Pai.

Mas no meu exemplo, o método depoistar da classe pai tem um parâmetro, portanto não dá para chamar assim:

public void depositar(double valor) {
    super();
    double juros = 0.10;
    this.saldo -= juros;
}

Se não daria erro de compilação, pois estou chamando um método(via super) que recebe parâmetro, mas sem passar o parâmetro.

Para entender melhor, temos que olhar um exemplo de objeto Poupanca chamando o método:

public class Main {
    public static void main (String[] args) {
        Poupanca p = new Poupanca();
        p.depositar(300);
    }
}

Repare que chamei o método depositar passando o valor 300 como parâmetro. O Java vai chamar o método depositar da classe Poupanca, sendo que a primeira linha desse método está assim:

super(valor);

Ou seja, essa linha está chamando o método depositar da classe Pai(classe Conta) e passando pra ele o mesmo valor que foi passado para o depositar da classe filha(Poupanca), que no caso foi 300.