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

This ou Super

Olá fiz alguns testes e não vi diferença em usar this ou super no metodo abaixo. Os dois apresentaram o mesmo resultado. Qual a diferença ?

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

8 respostas

Na verdade parando para analisar o código, notei que o método construtor da classe conta corrente passa os parâmetros e chama o construtor da classe conta. Por isso que é melhor usar o super então ? Porque na verdade quem constrói é a classe conta. Correto ?

Oi Daniel,

Não há diferença. Quando usamos herança, estamos ganhando os atributos e métodos protegidos da classe mãe. Como eles estão definidos na classe mãe e a classe filha os ganha por herança, super.saldo e this.saldo são a mesma coisa!

Abraços!

Então essa descrição abaixo

"Na verdade parando para analisar o código, notei que o método construtor da classe conta corrente passa os parâmetros e chama o construtor da classe conta. Por isso que é melhor usar o super então ? Porque na verdade quem constrói é a classe conta. Correto ?" Está correta, pode se usar tanto o this como o super, é o super é usado por causa da herança e porque o construtor da classe conta corrente chama o construtor da classe conta, certo ?

O this e o super são equivalentes apenas no exemplo que dei acima.

No entanto, no construtor da conta corrente você precisa chamar o construtor da classe conta. Ou seja, sempre que tiver uma filha você deve chamar algum construtor da mãe (regra). E a única forma de fazer isso, é usando o super já que não há herança de construtores. Se a classe mãe possuir um construtor padrão, a chamada é feita de forma automática e você não precisa chamar super() explicitamente.

abs

Certo Leonardo. Muito obrigado pelo esclarecimento, me perdoa por prolongar o assunto, mas é minha ultima pergunta. No casso o construtor da classe conta corrente é obrigado a chamar o construtor da classe conta ? Se sim qual o motivo ? Desde ja muito grato por sua atenção. <3

solução!

Oi Daniel,

Sim! Isso é uma regra da linguagem que ocorre também com herança de classes não abstratas (se conta fosse uma classe não abstrata, também vale a regra).

Observe o código de ilustração abaixo:

public class Mae {

    public Mae() { // construtor padrão, sem argumentos
        System.out.println("Eu sou a mãe");
    }

}
public class Filha extends Mae {

    public Filha() { // construtor padrão, sem argumentos
        System.out.println("Eu sou a filha");
    }

}
public class TestandoConstrutores {
    public static void main(String[] args) throws Exception {
        new Filha();
    }
}

Resultado:

Eu sou a mãe // chama o construtor da mãe ( super() ) implicitamente
Eu sou a filha // depois executa o construtor da filha

É como se no construtor da filha, tivesse um super() escondido dessa forma:

public Filha() { // construtor padrão, sem argumentos
        super(); // super invisível aqui!!!!
        System.out.println("Eu sou a filha");
}

Porém se a mãe deixar de ter um construtor padrão, você precisará chamá-lo na filha explicitamente:

public class Mae {

    public Mae(String nome) { // não é mais um construtor padrão, agora recebe um nome
        System.out.println("Eu sou a mãe. Me chamo " + nome);
    }

}
public class Filha extends Mae {

    public Filha() { // construtor padrão, sem argumentos
        super("Márcia"); // agora eu preciso chamar explicitamente!!!
        System.out.println("Eu sou a filha");
    }

}

Tudo bem? (OBS: E sinta-se a vontade pra perguntar o quanto quiser :) )

Abraços!

Excelente explicação, agora tudo faz sentindo. Muito obrigado Leonardo. Sem sombra de dúvidas alura foi o melhor investimento.

Bons estudos, Daniel.

Abração!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software