Imagine que você tem uma classe base(conta no caso), ela não tem um método setJuros().
Você herdou conta e criou uma poupança… até ai ok.
agora:
conta c1 = new poupanca();
c1.setSaldo(5454); // OK!
c1.setJuros(4); // OPA!
mas com c1 você só vai poder chamar os métodos que existem na classe conta… (que poderiam ser sobreescritos na classe poupanca). Mesmo possuindo um objeto poupanca!
uma dica, por padrão as classe começam com a primeira letra maiuscula!
faça “Conta” e “Poupanca”
entenda o seguinte o metodo setJuros() so existe na subclass ele nao existe na superclass… vc criou um objeto c1, que é do tipo da superclass e é um objeto da subclass, onde vai chamar todos os metodos subscritos da superclass, e setJuros()nao pertence a superclass entao vc nao pode chamar aquilo que a superclass nao conhece… ja que o relacionamento ai entre as classes chama-se É-UM. E você criou um objeto com esse tipo de relacionamento.
E o fato que o retorno ser da class filha de getSaldo() é pq o metodo foi subscrito na subclasse e vc tem um objeto que vai chamar os metodos que foi subscrito da superclass… por isso o resultado é da class filha… um exemplo um pouco mais claro veja:
class Carro{
public void cor(){System.out.println("sem cor");}
}
class Ferrari extends Carro{
public void cor(){System.out.println("azul");}
public void placa(){}
}
class Vendas{
Carro c = new Ferrari();
c.cor();//aqui ele vai chamar o da subclasse e imprimir azul
c.placa();// isso nem compila minha superclass nao tem o metodo placa.
}