Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Como eh feita a criacao dos objetos quando temos uma heranca

Estava praticando as referencias para os objetos e me deparei com a seguinte situacao:

Criei o atributo e os metodos deposita e saca na classe filha iguais as da classe pai (sem override mesmo, para ver o que iria acontecer) mas o getSaldo nao, deixei apenas na classe pai

Ao rodar a classe que possui o main, o getSaldo vem da classe pai (Ok!!) e o valor eh zero (??)

minha duvida... quando o objeto eh criado em memoria sao criadas duas variaveis saldo dentro do objeto e os metodos apontam para as "caixinhas" diferentes? Como eh feita a criacao dos objetos quando temos heranca?

public class Conta {

    private double saldo;

    public void deposita(double valor) {
        System.out.println("referencia contaC na Conta metodo deposita: " + this);
        this.saldo += valor;
    }

    public void saca(double valor) {
        this.saldo -= valor;
    }

    public double getSaldo() {
        System.out.println("referencia contaC na Conta metodo getsaldo: " + this);
        return saldo;
    }

}

public class ContaCorrente extends Conta {

    private double saldo;

    public void deposita(double valor) {
        System.out.println("referencia contaC na ContaCorrente metodo deposita: " + this);
        this.saldo += valor;
    }

    public void saca(double valor) {
        System.out.println("referencia contaC na ConcaCorrente metodo saca: " + this);
        System.out.println("retirar: " + valor);
        this.saldo -= valor;
        System.out.println(this.saldo);
    }

}

public class TestaConta {

    public static void main(String[] args) {
        ContaCorrente contaC = new ContaCorrente();
        System.out.println("referencia contaC na criacao objeto: " + contaC);
        contaC.deposita(500.0);
        contaC.saca(10.0);
        System.out.println("Saldo contaC: " + contaC.getSaldo());

    }
}

Saida:
referencia contaC na criacao objeto: bytebank.ContaCorrente@4aa298b7
referencia contaC na ContaCorrente metodo deposita: bytebank.ContaCorrente@4aa298b7
referencia contaC na ConcaCorrente metodo saca: bytebank.ContaCorrente@4aa298b7
retirar: 10.0
490.0
referencia contaC na Conta metodo getsaldo: bytebank.ContaCorrente@4aa298b7
Saldo contaC: 0.0
1 resposta

Opa, blz?

Sobre a pergunta:

Ao rodar a classe que possui o main, o getSaldo vem da classe pai (Ok!!) e o valor eh zero (??) minha duvida... quando o objeto eh criado em memoria sao criadas duas variaveis saldo dentro do objeto e os metodos apontam para as "caixinhas" diferentes? Como eh feita a criacao dos objetos quando temos heranca?

A resposta é não. Apenas um objeto é criado, mas esse objeto pode ter características de outro por meio de herança. Exemplo mais claro disso é o da classe Object, todos os objetos podem usar os métodos toString(), equals() e hashCode() pois herdam isso de Object.

No seu caso, você não tem os métodos getSaldo() e setSaldo(double algo) na classe ContaCorrente e seu atributo é private.. Se o getSaldo está apenas na super classe, você está pegando o saldo da super classe ..

Fora que a herança resolve justamente isso que você está testando: repetição de código.

Em resumo: acredito que só existe o objeto da subclasse e esse objeto possui uma cópia dos métodos herdados que podem vir de uma hierarquia complexa (3 ou 4 classes por exemplo, implementação de interfaces etc).