【发布时间】:2018-04-10 04:29:23
【问题描述】:
根据我正在关注的书,打印以下代码:
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";
}
}
打印:
学生
学生
人
java.lang.Object@130c19b
有人可以帮我解释一下原因吗?这里我是如何追踪代码的:
所以 m(newgraduateStudent()) 调用了对 m(Object x) 的多态调用,x.toString() 是由 GraduateStuent 类而不是 Object 类调用的,因为 GraduateStuent 是对象的实际类型。在可以在 GraduateStudent 类中调用 x.toString() 之前,编译器会在 GS 类中隐式创建一个无参数构造函数,因为没有一个。但是,在调用此构造函数之前,首先调用学生类构造函数,因为它是超类。在学生类中创建学生构造函数(因为它没有),但在调用构造函数之前调用 Persons 构造函数,因为它是超类,依此类推,直到我们到达 Object 超类,并且应该调用它的 to string 方法。 ...
我很确定我在很多事情上都错了(我是 2 个月的大学新生,对课程有一点了解)。那么有人可以解释我做错了什么吗?
【问题讨论】:
-
您似乎完全将构造函数和动态绑定的想法混为一谈。当您调用
toString()时,构造函数已完全完成(顺便说一句,这是不必要的,因为println(Object)会为您执行此操作)。您可以从问题的其余部分中完全消除对构造函数的讨论。看看这是否足以简化它以使其有意义。
标签: java inheritance constructor binding polymorphism