Проблема, которую оставил полиморфизм
An Animal[] can hold dogs and cats, and calling describe() works on all of them. But Dog has fetch(), which Animal does not — and through an Animal variable that method is invisible:
Animal x = new Dog("Rex");
x.fetch(); // error: cannot find symbol
The compiler goes by the declared type, not by what is actually inside. It sees an Animal, and Animals do not fetch.