privateなメソッドはオーバライドできる?

privateなメソッドをオーバライドすることができるか検証してみた。といってもテストコードを書いてみただけなので,厳密な定義を必要としている人はJavaの仕様書を読んだ方がいいと思う。

Main.java

abstract class Base {
    private String getName() {
        return "Base";
    }
    
    public void printName1() {
        System.out.println(getName());
    }
    
    public abstract void printName2();
}

class Derived extends Base {
    private String getName() {
        return "Derived";
    }
    
    public void printName2() {
        System.out.println(getName());
    }
}

class Main {
    public static void main(String[] args) {
        Derived derived = new Derived();
        
        derived.printName1();
        derived.printName2();
        
        ((Derived) derived).printName1();
        ((Derived) derived).printName2();
    }
}

実行結果

D:\tmp>javac Main.java

D:\tmp>java Main
Base
Derived
Base
Derived

D:\tmp>

とりあえずコンパイルは通っているのでprivateなメソッドの再定義には成功しているらしい。でも,呼び出し元の型に関わらず,printName1()では基底クラスのgetName()が,printName2()では派生クラスのgetName()が呼び出されている。つまり,privateなメソッドを呼び出す場合,呼び出されるのは呼び出し元メンバ関数が定義されているものなわけか。Javaのメソッドは全部継承可能だと思っていたけれど,そうじゃないんだなー。