当前位置: 首页 > 面试题库 >

Java中的绑定和分派有什么区别?

白通
2023-03-14
问题内容

有太多相关的名称:早期和晚期绑定,静态和动态调度,运行时与编译时多态等,我不知道它们之间的区别。

我找到了清楚的解释,但这是正确的吗?我将解释 JustinC

绑定: 正在确定变量的类型(对象?)。如果它是在编译时完成的,则它的早期绑定。如果在运行时完成,则绑定晚。

调度: 确定哪个方法与方法调用匹配。静态调度是在编译时计算的方法,而动态调度是在运行时执行的。

绑定是否分别将原始变量和引用变量与原始值和对象匹配?

编辑:请给我一些清晰的参考资料,以便我可以阅读更多有关此的内容。


问题答案:

我认为,这种混乱通常来自这些术语的超载。

我们使用高级语言对程序进行编程,而编译器或解释器必须将其转换为机器真正可以理解的内容。

粗略地说,您可以描绘出一个将我们的方法代码转换为某种形式的机器代码的编译器。如果编译器在稍后运行程序时准确地知道该方法在内存中的位置,则它可以安全地找到该已编译方法的每个方法调用,并将其替换为跳转到已编译代码的该地址。居住吧?

好吧,实现这种关系是我理解的约束力。但是,这种绑定可能在不同的时刻发生,例如在编译时,链接时,加载时或在运行时,这取决于语言的设计。

术语“静态”和“动态”通常分别用于指代运行时之前和运行时绑定的事物。

绑定时间越晚,灵活性越高;绑定时间越早,效率越高。语言设计师在创建语言时必须权衡这两个方面。

大多数面向对象的编程语言都支持子类型多态。在这些语言中,虚拟方法是在运行时绑定的,具体取决于此时对象的动态类型。换句话说,虚拟方法调用是在运行时基于所涉及的对象实现的动态类型而不是仅基于其静态类型引用而分派给适当的实现的。

因此,我认为,您必须首先将方法调用绑定到特定的实现或执行地址,然后才能向其分派调用。



 类似资料:
  • 绑定是否分别与原始值和对象匹配原始变量和引用变量? 编辑:请给我一些明确的参考资料,这样我就可以阅读更多关于这一点。

  • 问题内容: java中的继承和委托有什么区别? 如何在我的项目中使用以下示例?请你指导我。我了解继承,但对委托没有太多了解。因此,请给出适当的理由。我为什么要用这个? 问题答案: 当您委托时,您只是在调用一个知道必须做什么的类。您并不真正在乎它是 如何 执行的,您所 关心的 只是您正在调用的类知道需要做什么。 如果我是您,我将创建一个接口并命名该接口(或类似名称的接口),该接口具有一个名为的方法。

  • 我试图优化两个spark dataframes之间的联接查询,让我们将它们称为df1、df2(在公共列“saleid”上联接)。df1非常小(5M),所以我在spark集群的节点中广播它。df2非常大(200米行),所以我尝试通过“saleid”对它进行桶/重新分区。 例如: 分区: 水桶: 我不知道哪一个是正确的技术使用。谢谢。

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 问题内容: 我之所以问这个问题,是因为对该答案的评论主题进行了讨论。我有90%的方法可以解决问题。 存在三种不同形式: 绑定方法 , 未绑定方法 和 函数 对象之间的区别是什么,所有这些都由f1描述?一个人怎么称呼这三个物体?它们如何相互转化?关于这些东西的文档很难理解。 问题答案: 一个 功能 是创建由声明,或通过。在Python 2下,当函数出现在语句主体中(或传递给类构造调用)时,它将转换为

  • 问题内容: 我对这两个词感到非常困惑。我检查了stackoverflow,对于C ++有一个类似的问题,但对于Java没有。 有人可以解释一下Java的两个术语之间的区别吗? 问题答案: 概念上的区别很简单: 声明 :您 声明的 是某些东西,例如类,函数或变量。你不说任何事情 什么 是类或函数的样子,你刚才说,它的存在。 定义 :您 定义 某种事物的实现方式,例如类,函数或变量,即您说的 是 实际