Nie powinno się stosować zmiennych typu klasy abstrakcyjnej (Zwierze). Zrób sobie interfejs w którym stworzysz sygnaturę metody pij(), a następnie tworzysz sobie 3 klasy, które implementują ten interfejs. I później możesz stworzyć sobie zmienną typu interfejsu.
Interfejs zwierze = new Kot() // new Pies() // new Mysz()
Aby odnieść się do metody z interfejsu piszesz tylko zwierze.pij(); - i nieważne czy to będzie Kot, Pies itd... W taki sposób się wykorzystuje siłę polimorfizmu.
PS :
(ta metoda nie jest dostępna w klasie Zwierze - jest tylko i wyłącznie dostępna w klasie Kot)
I tutaj sobie sam odpowiedziałeś na pytanie, jak chcesz się odnieść do metody klasy Zwierze, skoro ona nie istnieje? Musi istnieć, a w klasach pochodnych być nadpisana. Wywołując później tą metodę w jej miejsce jest podstawiona implementacja konkretnej klasy pochodnej. (na tym polega polimorfizm)