実務を行う中で気になることがあったので、調査しました。
javaでは「thisで指定されたメンバ変数が自クラスにない場合、スーパークラスを参照しにいく」という挙動になると聞いたので試してみたのですが、確かにそうなりました。
試した結果は以下です。
【テストコード】
・Main.java
1 2 3 4 5 6 7 8 9 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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); } } |
【実行結果】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
■引数から与えられた値を参照(期待値10) 10 ■自クラスのメンバ変数をthis参照(期待値20) 20 ■自クラスのメンバ変数をthis参照(期待値30) 30 ■引数から与えられた値を参照(期待値10) 10 ■スーパークラスのみメンバ変数をthis参照(期待値20) 20 ■スーパークラスのみメンバ変数をsuper参照(期待値20) 20 ■両クラスにあるメンバ変数をthis参照(期待値40) 40 ■両クラスにあるメンバ変数をsuper参照(期待値30) 30 |
コメント