4
respostas

método x

Como ele consegue imprimir 1, se na classe D ele não tem implementado o método x? E o cast final foi de C para D?

abstract class B {
    void x() {
        System.out.println(y());
    }
    abstract int y();
}
abstract class C extends B {
    abstract int y();
}
class D extends C {
    int y() { return 1; }
}
class A {
    public static void main(String[] args) {
        D d  = (D) (C) new D();
        d.x();
    }
}

Obrigado.

4 respostas

Danilo, tem como você postar o código inteiro?

Assim, quem não tá fazendo esse curso mas já programa pode te ajudar também...

Abraço.

Adicionado código completo na dúvida.

Danilo, neste seu exemplo a classe D não precisa implementar a método x pois ele não é abstrato, sendo assim a classe D apenas está herdando o método da classe C que herda B que contém o método x. Os diversos cast explicítos na método principal não altera a saída de 1. Ficou claro?

Danilo, segue o passo a passo:

classe B declarada com métodos x (que printa y) e y (que faz nada);

classe C extende B. C herda os métodos x (que printa y) e o método y é sobrescrito pra fazer nada (nem precisaria ter a declaração dele, já que foi herdado e continua sem fazer nada);

classe D extende C. D herda os métodos x (que printa y) de C que, por sua vez, herdou de B. O método y é sobrescrito pra retornar 1;

classe A declarada. Objeto "d" do tipo D é criado (que tem o método x [que printa y]). Objeto "d" sofre cast pra C (que contém o método x [que printa y] e contém, também, o método y [que não faz nada]). "d", que sofre cast pra C (que tem o método x [que printa y] e tem, também, o método y [que não faz nada]), sofre novo cast pra D, que tem o metodo x [que printa y] e tem, também, o método y [que retorna 1] **Aqui está de onde sai o 1**.

d.x() -> "d" tem os métodos x [que printa y] herdado de C que, por sua vez, foi herdado de B, e o método y [que retorna 1], herdado de C mas que foi sobrescrito para retornar 1.

Assim, o método d.x() printa y (que retorna 1).

A saída será 1.

Ficou mais fácil de compreender?

Qualquer coisa, só postar.

Abraço.