在java中混淆了动态绑定和构造函数链接

在java中混淆了动态绑定和构造函数链接,java,inheritance,constructor,binding,polymorphism,Java,Inheritance,Constructor,Binding,Polymorphism,根据我下面的书,以下代码打印: 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

根据我下面的书,以下代码打印:

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(new graduateStudent())调用对m(对象x)的多态调用,x.toString()由graduateStudent类而不是对象类调用,因为graduateStudent是对象的实际类型。在GraduateStudent类中调用x.toString()之前,编译器会在GS类中隐式创建一个无参数构造函数,因为没有。但是,在调用此构造函数之前,首先调用学生类构造函数,因为它是超类。学生构造函数是在学生类中创建的(因为它没有),但在调用该构造函数之前,会调用Person构造函数,因为它是超类,依此类推,直到我们到达对象超类,并且应该调用它的to string方法


我很确定我在很多事情上都错了(我是一名两个月大的大学新生,有点不太正常)。有人能解释一下我的错误吗?

调用哪个方法并不取决于构造函数的执行。 然而,有一个技巧,父构造函数是作为子构造函数的第一步执行的。除非您显式添加它,否则编译器将添加它。例如,学生的构造函数如下所示:

public Student() {
  super(); //parent initialised before child
}
实际上您所做的是一个方法重写

您可以将重写视为替换任何父类中的方法。 为了理解这一点,您可以考虑继承链: 研究生->学生->个人->对象

将调用链中找到的第一个toString方法。实际上,这个版本用于原型继承,在java中实现方式不同。但要理解这一点就足够了

关于你的例子:

  • 您没有重写父学生类的父方法,因此调用了学生的方法
  • Student重写Person toString方法,调用Student的方法
  • Person重写对象的toString方法,调用Person的方法
  • 调用对象的toString,因为它没有父类,并且包含方法toString

您可以在Internet上阅读有关方法重写的更多信息:)

您似乎完全混淆了构造函数和动态绑定的思想。当您调用
toString()
(顺便说一句,这是不必要的,因为
println(Object)
将为您完成这项工作)时,构造函数已完全完成。您可以从问题的其余部分完全排除对构造函数的讨论。看看这是否足够简化它,使之有意义。