実務を行う中で気になることがあったので、調査しました。
 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 | 
 
  
  
  
  

コメント