动态绑定和构造函数链之间的困惑按照书上的我下面,下面的代码打印:在Java
public class DynamicBindingDemo {
public static void main(String[] args) {
m(new graduateStudent());
m(new Student());
m(new Person());
m(new Object());
}
public static void m(Object x) {
System.out.println(x.toString());
}
}
class GraduateStudent extends Student {
}
class Student extends Person {
public String toString() {
return "Student";
}
}
class Person extends Object {
public String toString() {
return "Person";
}
}
打印:
学生
学生
人
有人可以帮我解释为什么吗?在这里,我如何跟踪代码:
因此,m(new graduateStudent())调用m(Object x)的多态调用时,x.toString()由GraduateStuent类而不是Object类调用,因为GraduateStuent是实际对象的类型。在可以在GraduateStudent类中调用x.toString()之前,编译器会在GS类中隐式创建一个无参数构造函数,因为没有它。但是,在调用此构造函数之前,首先会调用学生类构造函数,因为它是超类。学生构造函数是在学生类中创建的(因为它没有),但是在构造函数被调用之前,人类构造函数被调用,因为它是超类等等直到我们到达Object超类,并且它的字符串方法应该被调用。 ...
我很确定我在很多事情上是错的(我是一个2个月的大学新生,这是一个小课程)。那么有人可以解释我出错了吗?
方法重载你似乎完全混为一谈构造和动态绑定的想法。当你调用'toString()'(这是不必要的,顺便说一下,因为'println(Object)'会为你做),构造函数就完成了。您可以完全消除问题其余部分对构造函数的讨论。看看这是否足够简化它是有道理的。 – chrylis