技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

java:thisで指定されたメンバ変数が自クラスにない場合、スーパークラスを参照しにいく

javaでは「thisで指定されたメンバ変数が自クラスにない場合、スーパークラスを参照しにいく」という挙動になると聞いたので、やってみました。
確かにそうなりました。
 
【テストコード】
・Main.java
package jp.co.thistest;
public class Main {
    public static void main(String[] args) {
        ThisClass obj = new ThisClass();
        SpecializeClass obj2 = new SpecializeClass();
        obj.method(10);
        obj2.method(10);
    }
}

・ThisClass.java
package jp.co.thistest;
public class ThisClass {
    int a = 20;
    int b = 30;
    public void method(int a) {
        System.out.println
        ("■引数から与えられた値を参照(期待値10)");
        System.out.println(a);
        System.out.println
        ("■自クラスのメンバ変数をthis参照(期待値20)");
        System.out.println(this.a);
        System.out.println
        ("■自クラスのメンバ変数をthis参照(期待値30)");
        System.out.println(this.b);
    }
}

・SpecializeClass.java
package jp.co.thistest;
public class SpecializeClass extends ThisClass {
    int b = 40;
    public void method(int a) {
        System.out.println
        ("■引数から与えられた値を参照(期待値10)");
        System.out.println(a);
        System.out.println
        ("■スーパークラスのみメンバ変数をthis参照(期待値20)");
        System.out.println(this.a);
        System.out.println
        ("■スーパークラスのみメンバ変数をsuper参照(期待値20)");
        System.out.println(super.a);
        System.out.println
        ("■両クラスにあるメンバ変数をthis参照(期待値40)");
        System.out.println(this.b);
        System.out.println
        ("■両クラスにあるメンバ変数をsuper参照(期待値30)");
        System.out.println(super.b);
    }
}

【実行結果】
■引数から与えられた値を参照(期待値10)
10
■自クラスのメンバ変数をthis参照(期待値20)
20
■自クラスのメンバ変数をthis参照(期待値30)
30
■引数から与えられた値を参照(期待値10)
10
スーパークラスのみメンバ変数をthis参照(期待値20)
20
スーパークラスのみメンバ変数をsuper参照(期待値20)
20
■両クラスにあるメンバ変数をthis参照(期待値40)
40
■両クラスにあるメンバ変数をsuper参照(期待値30)
30