GbR:
Então deixa eu ver se eu entendi:
overload = sobrecarga de métodos
override = reescrever; polimorfismo?
Isso, mas não é necessário utilizar a @Overload para sobrecarga de métodos. Agora o @Override sim.
Funciona assim:
Os construtores:
Todos são padrões, como você não declarou construtor em nenhuma classe, todos construtores ficam em branco
Conta c = new Conta();
ContaCorrente cc = new ContaCorrente();
ContaPoupanca cp = new ContaPoupanca();
Quando você deposita você utiliza o método depositar.
‘C’ é uma instancia da classe Conta, então C.deposita(1000) vai chamar o método deposita da classe Conta
void deposita(double valor) {
this.saldo += valor;
}
‘CC’ é isntancia da classe ContaCorrente que estende a classe Conta. Repare que na classe ContaCorrente você sobrescreveu o método deposita. Como ele foi sobrescrito, quando vc usar o código CC.deposita(1000) ele vai chamar a função deposita da classe ContaCorrente
@Override
void deposita(double valor) {
this.saldo += valor - 0.10;
}
‘CP’ é uma instancia da classe ContaPoupanca que estende a classe Conta. Como vc não sobrescreveu o métoda da superClasse (da classe Conta), quando vc chama o método cp.deposita(1000) ele vai chamar o método deposita() da classe Conta:
void deposita(double valor) {
this.saldo += valor;
}
A mesma coisa acontece com o método atualiza. ‘C’ chama o método atualiza da classe Conta. ‘CC’ chama o método atualiza da classe ContaCorrente, pois vc reescreveu o método na classe. Em ‘CP’ idem a ‘CC’.
Quando você utiliza o getSaldo, como nem ContaCorrente, nem ContaPoupanca sobrescreveram este método, ele será chamado da superClasse (Conta).
Ai fica a a seu critério qual classe escolher qual classe usar. Você tem que usar a classe que vc precisa.