this 到底指向谁

95 阅读1分钟

我们在初学 Java 基础时,this 一般都是这样解释的:哪个对象调用,this 就代表哪个对象

这时我就有疑问了,那如果我父对象调用,this 难道还能指向父对象不成,

先说结论:

  • this.属性 只会指向当前类的属性
  • this.方法 才是谁调用就指向谁

实测:

 public class extend_Test1 {
     public static void main(String[] args) {
         Son son = new Son();
         son.method();
     }
 }
 class Father {
     
     private String name = "Father的属性";
 ​
     public void method() {
         System.out.println(this.getClass()); 
         System.out.println(this.name); 
     }
 }
 ​
 class Son extends Father {
     
     public String name = "Son的属性";
 ​
 }

打印结果如下:

image.png

很奇怪吧,this 的运行时类型明明是 Son,打印属性的结果却是 Father 的属性,于是我决定在父类和子类中都定义一个方法,并通过反射获取 this 的属性值

 public class extend_Test1 {
     public static void main(String[] args) {
         Son son = new Son();
         son.method();
     }
 }
 class Father {
     private String name = "Father的属性";
 ​
     public void abc() {
         System.out.println("FatherFather");
     }
 ​
     public void method() {
         System.out.println(this.getClass());
         System.out.println(this.name);
         this.abc();
 ​
         for (Field field : this.getClass().getDeclaredFields()) {
             try {
                 Object value = field.get(this);
                 System.err.println("属性值:" + value);
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             }
         }
     }
 }
 ​
 class Son extends Father {
     public String name = "Son的属性";
 ​
     public void abc() {
         System.out.println("SonSon");
     }
 }

打印结果如下:

image.png

为此我想起来了一个知识点,不知道和这个问题有没有关系,那就是属性是在编译时就确定下来的,没有多态的概念,但是感觉这跟 this 的关系也不大,可能只能等后面学到 jvm 的时候才能有个完美的解答了