Herança

4 respostas
herançajava
D

Fala, pessoal…

Uma dúvida sobre um comportamento de herança:

class Retangle {

    }

    public class Square extends Retangle {
        public double area() {
            return 0.0;
        }
        
        public static void main(String args[]) {
            Retangle square = new Square();
            System.out.println(square.area());
        }
    }

O código acima me dá o seguinte erro:

Square.java:13: error: cannot find symbol

System.out.println(square.area());

^

symbol:   method area()

location: variable square of type Retangle

1 error

Alguém saberia me dizer porque o código exige a implementação do método area() na superclasse, tendo em vista que se ele for implementado ainda assim é o método da classe derivada que será invocado?

4 Respostas

staroski

Sua variável foi declarada como sendo do tipo Rectangle e a classe Retangle não possui o método area() quem possui é a classe Square.

O compilador não vai verificar qual a referência da variável square, ele só valida a chamada de métodos a partir do tipo de dado que a variável foi declarada.

D

@staroski,

Acho que compreendi. No caso, em tempo de compilação a verificação é do tipo estático do objeto, ou seja da declaração. E o método só existe no tipo dinâmico. É isso?

staroski

Isso.

Se quiser o polimorfismo, podes declarar o método na classe Retangle e sobrescrever na classe Square

D

Obrigado, @staroski.
Foi só uma dúvida conceitual mesmo.
Quanddo vc falou eu me lembrei do conceito:

Retangle square [compilator] = new Square() [Runtime]

Vlw pelo esclarecimento.

Criado 4 de novembro de 2019
Ultima resposta 4 de nov. de 2019
Respostas 4
Participantes 2