Только для реализации полиморфизма. Стандарт де факто ООП к этому настойчива призывает. Хотя почему то не всех призвал например к множественному наследованию как в плюсах.
В Java много заимствований из C++. Вот и абстрактные классы заимствовали. В C++ нет интерфейсов. Как без абстрактных классов реализовать класс, у которого не все методы определены? Конечно, можно сделать пустой метод. Преимущество абстрактного метода в том, что его необходимо определить в потомке (если он не абстрактный). Пустой метод можно забыть переопределить.