はじめに

Javaにおいては、privateメソッドはサブクラスでオーバーライドしても、実行時に動的バインドされません。

以下にこの動きを検証するコードを示します。

実証コード

冒頭で説明した動きを実際に確認するために、以下のようなコードを書いて実行してみてください。

サンプルコード
class Super
{
    private void process()
    {
        System.out.println("Super の process() が呼ばれました。");
    }

    public void launch()
    {
        this.process();
    }
}

class Sub extends Super
{
    public void process()
    {
        System.out.println("Sub の process() が呼ばれました。");
    }
}

class EntryPoint
{
    public static void main(String[] aArguments)
    {
        Super tSuper=new Super();
        tSuper.launch();

        Sub tSub=new Sub();
        tSub.launch();
    }
}

このプログラムをコンパイル/実行した結果は、下記の通りです。

実行結果
Super の process() が呼ばれました。
Super の process() が呼ばれました。

ご覧のとおり、スーパークラスで定義されたメソッドをサブクラスでオーバーライドする場合、スーパークラス側で定義されたメソッドがprivate修飾されていると、サブクラスのインスタンスを生成して処理を行っても、サブクラス側のメソッドが動的バインドにより呼び出されることはありません。(スーパークラスのメソッドがpublicおよびprotected修飾される場合には、サブクラス側でオーバーライドしたメソッドが呼び出されます。)

これはprivateメソッドがそのクラス内にのみ通用するメソッドであり、privateメソッドはオーバーライドしても動的バインドの対象外であることを意味しています。

ちょっと不思議な感じですが、Javaの言語仕様どおりの動作です。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まさにこれだ
4 (80%)
ちょっと違う
1 (20%)

【まさにこれだ】 ありがとうございます! (2021/01/18 Mon 17:59:23)