【问题标题】:Static binding and dynamic binding with no methods没有方法的静态绑定和动态绑定
【发布时间】:2016-04-02 14:06:23
【问题描述】:

我在大学里参加了面向对象编程的考试。其中一个问题是关于静态绑定和动态绑定。

问题如下:

Shape s; if(i==1) s = new Point(1,2); else s = new Rectange(10,20); //this is dynamic binding.

是/否 顺便说一句,这不是我的答案。

我的老师说答案是“不”,因为它是静态绑定。

据我所知,静态绑定和动态绑定仅在我调用方法时才会发生。我阅读了有关此主题的所有 StackOverflow 问题和大量博客文章,我能想到的唯一答案是存在动态绑定

任何解释将不胜感激。

【问题讨论】:

  • 您将s 硬编码为指的是PointRectangle 实例……这有什么动态
  • 这只是一个猜测,但也许你老师的意思是可能的类型在编译时是已知的。无法在运行时引入新的未知类型,就像使用反射来实例化对象一样。

标签: java dynamic-binding late-static-binding


【解决方案1】:

“绑定”只是意味着您将名称与对象相关联,因此这里正在进行绑定。

这是动态绑定,见the wikipedia article

程序运行前的名字绑定称为静态(也称为“早期”);程序运行时执行的绑定是动态的(也称为“后期”或“虚拟”)。

静态绑定的一个例子是直接的 C 函数调用:标识符引用的函数在运行时不能更改。

但是动态绑定的一个例子是动态调度,就像在 C++ 虚拟方法调用中一样。由于多态对象的具体类型在运行前(通常)是未知的,因此执行的函数是动态绑定的。

尽管发布的代码通过设置 i 预先确定了 s 的设置,但动态的原因是在 s 上调用的方法将在运行时得到解决。

【讨论】:

    【解决方案2】:

    没有。这是动态绑定。

    i 变量的值在编译时是未知的。根据运行时 i 变量的值,已设置 Shape。正如 Nathan Hughes 所建议的,Shape 上调用的方法在运行时解析,这使其成为后期动态绑定。

    【讨论】:

      猜你喜欢
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      相关资源
      最近更新 更多