超级,这个,静态绑定动态绑定

时间:2015-12-27 20:35:24

标签: java

为什么super使用静态绑定,但this使用动态绑定?
代码如下。

public class Person {
    public void method1() {
        System.out.print("Person 1");
    }
    public void method2() {
        System.out.print("Person 2");
    }
}

public class Student extends Person {
    public void method1() {
        System.out.print("Student 1");
        super.method1();
        method2();
    }
    public void method2() {
        System.out.print("Student2");
    }
}

public class Undergrad extends Student {
    public void method2() {
        System.out.print("Undergrad 2");
    }
}

当我在主要方法中输入以下

Person u = new Undergrad();
u.method1();

结果是:Student 1 Person 1 Undergrad 2

2 个答案:

答案 0 :(得分:1)

这不是一个琐碎的问题,因为可能没有其他答案。 Learning Java book中对此有下降的解释:

  

应用于超级类的重写方法时,超级引用的使用是特殊;它告诉方法解析系统停止在超类而不是在最派生的类上进行动态方法搜索(否则这样做)。

当Undergrad调用method1()时,由于未在Undergrad中重写它,因此将调用Student的method1()。

问题集中于学生方法1中的这两行:

    super.method1();
    method2();

等同于:

    super.method1();
    this.method2();

注意:调用此函数的动态对象是Undergrad。

因此在第二行-this.method2()将动态绑定到Undergrad的method2()。 但是,在第一行中-super.method1()不会动态绑定到Undergrad的超类(即Student),但是将(在编译时)静态绑定到Student的父类(是人)。

这看起来并不简单,而且是super.method1()的替代(不正确)选项;调用Undegrad的超类(学生)method1有点合理。

答案 1 :(得分:0)

因为当从Student调用super.method1()时,它意味着从Student的父类Person调用method1(),这不是超级工作吗?