【java】staticメソッドってポリモーフィズム効かないの?
今回のテーマ
今回はjava SE Silverの学習中に詰まった一つの問題について記載します。 今回詰まったところがポリモーフィズムについてstaticメソッドになると 挙動が違うことがわかったのでその点についてになります。
ポリモーフィズムについて
詳しい解説は以下の参考サイトがわかりやすかったので
そちらに任せますが私の理解では
同じメソッド名でも処理が違う。処理中身を変えることができること
実現方法はメソッドのオーバライドやオーバロードが挙げられます。
参考
Javaのポリモーフィズムについて現役エンジニアが解説【初心者向け】 | TechAcademyマガジン
まずは前題
サンプルコードをあげて説明する。
class A { public void WhatClass(){ System.out.println("これはAクラスです"); } void y() { WhatClass(); } } class B extends A{ public void WhatClass() { System.out.println("これはBクラスです"); } } public class Test{ public static void main(String[] args) { B b =new B(); b.y(); } } // 出力結果 これはBクラスです
インスタンス化など基本的な内容は本ブログでは省きますが
処理の流れとしては以下の通りです。
①TestクラスでmainメソッドからまずBクラスをインスタンス化して 「b」の変数にいれる ②Bクラスのyメソッドを起動 ③しかしBクラスにはyメソッドがない →スーパクラスであるAクラスを探しにいく ④Aクラスにyメソッドがあるのでyメソッドを起動 ⑤yメソッドからWhatClassメソッドを起動する。 ⑥AクラスとBクラスに両方にWhatClassがある
そして最終結果は 今回はサブクラスのBクラス側のWhatClassメソッドが起動する
本題
しかしWhatClassメソッドがstaicメソッドの場合はどうなるか
class A { public static void WhatClass(){ System.out.println("これはAクラスです"); } void y() { WhatClass(); } } class B extends A{ public static void WhatClass() { System.out.println("これはBクラスです"); } } public class Test{ public static void main(String[] args) { B b =new B(); b.y(); } } // 出力結果 これはAクラスです
処理の流れは前題と同じですが、staticメソッドになると 今度はスーパクラスのAクラスの WhatClassメソッドが呼び出されました。
まとめ
上記のサンプルコードから以下のことが言えます。
インスタンスメソッドの場合はサブクラスが優先される staticメソッドの場合はスーパクラスのメソッドが優先される
最初類似問題に当たったときは「Bクラスをインスタンス化させているので Bクラス側のメソッドが優先されるのでは」と思いました。
ポリモーフィズムの理論からはBクラスでWhatClassメソッドをオーバライド しており、インスタンス化させた側のメソッドが優先されるのが通常の認識ですが、staticメソッドではこういった原理で動くようです。
理論的になぜかが言えたら良かったのですが、私は説明できなかったです。
資格対策としてはよくはないですがこういったケースがあることを頭に入れとくか
学習文献
オラクル認定資格教科書 Javaプログラマ Silver SE11(試験番号1Z0-815)
- 作者:山本 道子
- 発売日: 2019/11/18
- メディア: 単行本(ソフトカバー)