>> オーバーライドを前提とした・・・
とりあえずそれは正しい。
例えば名前を返すメソッドを持つフルーツクラスを考える。
class Fruit { public String getName() { ... } }
こいつを継承して リンゴクラス、バナナクラス、... を作るとしよう。
ポリモーフィズムがわかるなら、
getName() を Fruit クラスに書かなくちゃいけないのは分かるはず。

さて。じゃぁなんで抽象メソッドってものがあるかというと、
Fruit クラスは "リンゴ" とか "バナナ" とか固有の名前を決められないから。
抽象クラスはそれだけでは存在しえない場合に利用する。
しかしあらゆる Fruit に共通の処理をするプログラムは書くことができる。
abstract class Fuit { public String getName(); }
class Foo {
  // リンゴにもバナナにも依存しないが、Fruit の名前を表示するメソッド
  public void printName( Fruit f ) {
    System.out.println( f.getName() );
  }
}
また、abstract により Fruit の new を禁止するため、
名前の無い Fruit が作られる心配が無い。