Java FAQ:クラスメソッド、インスタンスメソッドかにより継承先から呼んだメソッドが変わる

Java FAQ:S011 Q-17

まんま

class C2008042901 {
    static void method1() {
        method2();
    }

    static void method2() {
        System.out.println("Super#method2()");
    }
}

class C2008042902 extends C2008042901 {
    static void method2() {
        System.out.println("Sub#method2()");
    }
}

public class C2008042900 {
    public static void main(String[] args) {
        new C2008042902().method1();
    }
}

で、

Super#method2()

そもそも method1 がインスタンスメソッドで呼べるのも多少不思議


インスタンスメソッドで

class C2008042911 {
    void method1() {
        method2();
    }

    void method2() {
        System.out.println("Super#method2()");
    }
}

class C2008042912 extends C2008042911 {
    void method2() {
        System.out.println("Sub#method2()");
    }
}

public class C2008042910 {
    public static void main(String[] args) {
        new C2008042912().method1();
    }
}

で、

Sub#method2()