Nevesel, оба класса — abstract, абстрактные. Они просто описывают набор методов, иногда без конкретной реализации. Например, можно заиметь абстрактный класс Bird, который имеет реализацию sayWord() (чик-чирик), но не имеет конкретной реализации метода getSize(), который должен возвращать размер птицы.
Очевидно, нельзя создать конкретный экземпляр класса Bird, так как не определён метод getSize(). Зачем вообще тогда нужны абстрактные классы?
Скажем, ты можешь создать конкретную реализацию класса Bird, например, BigBird, или SmallBird. Оба этих класса наследуют класс Bird и реализуют getSize().
Тогда можно работать с переменной типа Bird, которая на самом деле является либо BigBird, либо SmallBird.
class BigBird extends Bird {...}
{
Bird kesha = new SmallBird();
kesha.getSize(); // small
// Проходит время
kesha = new BigBird();
kesha.getSize();
}
Можно так писать, потому что и BigBird, и SmallBird содержат метод getSize и являются наследниками Bird.
Зачем? Один программист описывает интерфейс — набор методов, которые нужны для работы. А другой программист пилит конкретные реализации, так что можно заменить одну реализацию (BigBird) на другую (SmallBird) и всё будет работать.