代码如下,一个父类Muman,一个子类Student,一个测试类Main
Human类
package com.matrwe;
public class Human {
public int age = 1;
public void getAge(Student student) {
System.out.println(this.age);
System.out.println("this是否就是student实例:" + (this == student));
}
}
Student类
package com.matrwe;
public class Student extends Human{
public int age = 0;
}
测试类
package com.matrwe;
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.getAge(student);
System.out.println(student.age);
}
}
结果
可以看到我在测试类当中调用了父类的getAge方法,因为子类没有重写,所以调用的是父类的方法
而在方法中我输出了this.age(其实就等于直接写age,因为参数列表没写age)
Java中的this指向方法的调用者,也就是测试类中实例化的student,我也在方法的参数中传入了student和this进行比较进一步确认了这一点
所以说这段代码的意思就是输出student实例的age
我们再看测试类中输出的student实例的age,结果是0
而调用的getAge方法输出的却是1
按照this的定义这里输出的两个结果不应该都是0吗
这是我画的内存图,因为student是用Student类型接受的,因此调用student中的变量时应该先到堆空间的左半部分寻找也就是0
下面的System.out.println(student.age);也证明了输出结果就是0,实例对象会优先寻找自身的age
但是getAge方法输出的结果却是1,按理说方法中的this.age指的就是方法调用者student的age应该就是0,为什么输出的却是1
(不要说就近原则,这只是一个记忆方式,我想要知道的是原理)