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; }
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; }
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
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!!