一道关于继承的面试题

题目描述

class Super{
    private  String name = "Super";
    public String getName() {
        return this.name;
    }
}
public class Sub extends Super{
    private String name = "Sub";
    public static void main(String[] args) {
        Sub sub = new Sub();
        //Super
        System.out.println(sub.getName());
    }
}


你期待的结果是什么?实际看到的错误信息又是什么?

我以为会输出sub, 但实际输出了super. 我一直以为this指代的是方法的调用者, getName()是sub调用的, 所以其中this的应该是sub, 那么sub.name应该是sub; 但是这很明显错了

阅读 1.9k
3 个回答

this指向的就是创建的Sub sub = new Sub();对象,Sub继承Super后拥有两个name属性,一个是自己的name = "Sub",一个是父类的name = "Super",Sub没有重写getName方法,调用的是父类的getName方法,this.name是继承父类的name="super"属性。

子类没有重写 getName 方法,所以调用的 getName 方法是父类的。在父类的方法里面 this.name 指向的是父类的 name 属性的地址。

如果子类重写了父类的 getName 方法,子类的 this.name 就是sub 了。

Java 里重载只对方法. 首先 getName 没有被重载. 调用是 Super 类的 getName, 而这个方法里的 this, 是指向 Super.this.name 类的实例属性.

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