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