そもそも、なぜ同名のメソッドを作るのか

同名のメソッドを作る理由は、わかりやすさというわけではない。もちろんわかりにくい名前を付けてもいいというわけじゃないけれども、それだけが理由じゃない。
メソッド名というのは抽象化の産物であるわけだ。

Animal animals[] = new Animal[3];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new Bird();

for(int i = 0; i < 3; i++){
    animals[i].move();
}

ということが出来ないと困るよね、ということである。つまりはインターフェースの存在意義もそこにある。

animals[i].move();

のところでは、animalsの中身がなんであるか(犬でも猫でも鳥でも)に関わらず出来ることである必要がある。返り値も同様で、animalsの中身がなんであるかに関わらず扱えなくてはならない。
例えば、Animal型ではObject型を返すようにしてあるhogeというメソッドがあるとする。これをDog型ではInteger型を返すようにするということができたとしよう。
しかしながら

Integer integer = animals[0].hoge();

は出来ない。

Object o = animals[0].hoge();

という扱い方「しか」出来ないのだ。出来るのは、

Dog dog = new Dog();
Integer integer = dog.hoge();

という使い方だけであって、それじゃあわざわざ同名のメソッドとして別の型を返す必要も無いよね、ということになる。他の名前のメソッドとして定義してやっても、別に開発効率に影響ないじゃん?ということ。
Javaのこの辺の考え方っていうのはすごい素敵だと思う。Javaはそれ自身としては結構完成されてる、と思う。もちろん嫌いな人もいるけど、俺は結構好きだったりする。自分で使いたくはないけどね。