关于继承中谁调用get方法

父类
public class Person{

  private String name;
  public Person(String name){
       this.name=name;
  }
  public void setName(String name){
      this.name=name;
  }
  public String getName(){
     return this.name;
 }

}
子类
public class Student extends Person{

  public Student(String name){
       super(name);
 }
 public String print(){
       return getName();
 }

}
子类中谁在调用getName()方法,是子类对象在调用吗?这里能理解成this.getName()不,而这里的this表示调用该方法的当前对象(即子类对象)。而这里的getName()方法继承了父类的方法,那么该方法中this.name中的this,又表示的哪个对象呢?麻烦了。

阅读 2k
2 个回答

java中的多态是通过invokevirtual指令实现的,他的调用过程可以分为以下几步:

  1. 先从操作栈中找到对象的实际类型 class;
  2. 找到 class 中与被调用方法签名相同的方法,如果有访问权限就返回这个方法的直接引用,如果没有访问权限就报错
    java.lang.IllegalAccessError ;
  3. 如果第 2 步找不到相符的方法,就去搜索 class 的父类,按照继承关系自下而上依次执行第 2 步的操作;
  4. 如果第 3 步找不到相符的方法,就报错 java.lang.AbstractMethodError ;

很明显你这里并没有继承父类的方法,所以这里调用父类的getName方法。当然返回的也是父类name属性。

如果你的子类继承了getName方法,并且返回的是 return super.getName();,那么你的print方法里面调用的就是子类的getName方法,然后再去调用父类的getName方法(当然返回的也是父类的name属性)。

return getName()就相当于return this.getName(), this是表示调用该方法的当前对象,你这里就是子类Student对象。
Student 中的getName()方法是从父类继承下来的,所以this.name中的this当然也是Student对象,记住一句话,this指向的调用该方法的当前对象。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题