【问题标题】:Confused between dynamic binding and constructor chaining in javajava中的动态绑定和构造函数链接之间的混淆
【发布时间】: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


【解决方案1】:

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

public Student() {
  super(); //parent initialised before child
}

你实际上做的是一个方法覆盖。

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

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

所以关于你的例子:

  • 您没有覆盖父 Student 类的父方法,因此调用 Student 的方法
  • Student 覆盖 Person toString 方法,调用 Student 的方法
  • Person 覆盖 Object 的 toString 方法,调用 Person 的方法
  • 对象的 toString 被调用,因为它没有 Parent 类并且包含方法 toString。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2015-02-14
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多