オーバーライドとオーバーロード Java編

こんにちは
村上です。

たぶん今年最後のJavaネタです。

オーバーライドとオーバーロードの違いって知ってますか?

そんなの当然!!

って声が聞こえてきそうですね。

とりあえずおさらい

オーバーライド

ってクラスがあった時に下記の実行結果は

ですね。

つまり、ParentクラスのhogeメソッドはChild1、Child2クラスで上書きされるっていうことです。
ここには継承やら多態性やらオブジェクト指向的なことが発生してこうなるんですが、そこら辺は深くは触れないです。

オーバーロード

次にオーバーロードです。

というメソッドがあるとき下記の実行結果は

ですね。

ようするにfooメソッドの引数が異なれば多重定義できるということです。

この実行結果は?

では次の実行結果はどうなるでしょうか?

オーバーライドとオーバーロードの混合技です。

cp1、cp2のオブジェクトの実態はChild1、Child2です。そして、多態性を利用してParentで宣言されてます。
fooメソッドは引数がParent、Child1、Child2で多重定義されています。
何が出力されるでしょうか?

実行結果は

結果も混合ですね。

オーバーロード側はオブジェクトはParentと認識され、オーバーライド側はChild1、Child2と認識されています。

これはどういうことかというと、オーバーロードはコンパイル時にメソッド呼び出しが決まり、オーバーライドは実行時にメソッド呼び出しが決まるからです。
cp1もcp2も宣言はParentなので、オーバーロードはfooの引数がParentのメソッドが呼ばれます。
また、実行時つまり実態はChild1およびChild2になるので、オーバーライドはそれぞれオーバーライドされたメソッドが呼ばれています。

まとめ

とくにまとめることは無いですが、昔このコードを書いて思った実行結果にならないので、調べた内容です。
まぁ、テストすれば思った動きをしないので発見されずに不具合に至ることは多分ないですが、なぜかわからずハマることがあります。

Javaのちょっとした雑学ということで、現場のプログラマの人に聞いてみて下さい。
みなさん意外と知らないと思います。

Comments are closed, but you can leave a trackback: Trackback URL.