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

Sobrescrição de metodos @override

Entendi que utilizamos a palavra chave "super" para referenciar, mas fiquei na duvida em um contexto que uma classe tem várias filhas e netas. Exemplo Classe Animal > Classe Mamifero > Classe Cachorros > Classe ViraLataCaramelo

Se na classe ViraLataCaramelo que é bisneta da classe Animal eu chamar em um método a palavra "super", vou estar referenciando um metodo da classe Animal ou da classe Cachorro?

No exemplo da aula ele utiliza uma classe abstrata Conta que tem a filha ContaCorrente e tem o método abaixo escrito A palavra super é para fazer referência a classe abstrata Conta.

@Override public boolean saca(double valor) { double valorASacar = valor+0.2; return super.saca(valorASacar); }

Minha dúvida é, se eu criar uma filha para a classe ContaCorrente e for fazer um @override do método saca e chamar a palavra super, ele vai ir para o metodo da classe Conta ou da classe contaCorrente?
2 respostas

Olá Ronald.

A chamada com super, vai executar o código da classe mãe mais próxima que tenha implementação do método.

Analisando o seu exemplo:

Vamos assumir que a classe ViraLataCaramelo sobrescreva um método qualquer e chame o super. Pra processar essa chamada ao super, o Java vai olhar pra classe Cachorro. Se houver uma implementação na classe Cachorro, será executada essa implementação. Se não houver implementação na classe Cachorro, aí o Java vai olhar na classe Mamifero, se houver implementação, executa a implementação da classe Mamifero, caso contrário, olha na classe Animal e assim vai...

solução!

Não sei se vai te ajudar ou confundir mais hehe, mas se quiser fazer um exercício de observação, copie esse código todo pra um arquivo java e execute. Veja o resultado e tente entender o fluxo:

class TesteSobrescrita {

    public static void main(String[] args) {
        Animal viraLata = new ViraLata();

        System.out.println("vira lata vai falar:");
        viraLata.fala();
        System.out.println();

        System.out.println("vira lata vai comer:");
        viraLata.come();
        System.out.println();

        System.out.println("vira lata vai andar:");
        viraLata.anda();
        System.out.println();

        System.out.println("vira lata vai dormir:");
        viraLata.dorme();
        System.out.println();
    }
}

class Animal {
    void fala() {
        System.out.println("animal falando");
    }

    void come() {
        System.out.println("animal comendo");
    }

    void anda() {
        System.out.println("animal andando");
    }

    void dorme() {
        System.out.println("animal dormindo");
    }

}

class Mamifero extends Animal {

    @Override
    void fala() {
        System.out.println("mamifero falando");
    }

    @Override
    void come() {
        super.come();
        System.out.println("mamifero comendo");
    }
}

class Cachorro extends Mamifero {

    @Override
    void fala() {
        System.out.println("au");
    }

}

class ViraLata extends Cachorro {

    @Override
    void fala() {
        super.fala();
    }

    @Override
    void come() {
        super.come();
    }

    @Override
    void dorme() {
        super.dorme();
    }
}

Veja que o main chama os métodos na classe ViraLata, aí dependendo das implementações que herdadas ou sobrescritas, uma mensagem diferente aparece.

Se ficar alguma dúvida no entendimento, volte a postar

Abs

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