问题标签 [static-binding]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1220 浏览

java - Java中的静态绑定和动态绑定

起初我是一个初学者
,我看了很多教程,阅读了很多例子,甚至从 JLS 都试图理解这个主题,但我仍然有一些困惑或误解。

让我告诉你我无法理解的问题。

假设我们有三个类Parent, Child1Child2如下所示:

我的理解是,因为 和 的引用p1来自p2type Parent,所以doSmth(Object)只有编译器才能看到。

因为p1.doSmth("String");编译器没有绑定它,因为有一个覆盖方法,所以它只是让JVM在运行时绑定它(动态绑定)。

p2.doSmth("String");编译器绑定它,因为它没有找到覆盖它的方法(静态绑定)。

问题是,我说的是真的吗?还是我有误解?如果它是错误的,那么请告诉我在这种情况下编译器会采取哪些步骤?
如果它是真的,编译器怎么能期望p1.doSmth它有一个覆盖方法(虽然它不知道它是真正的类型),而p2.doSmth它只是绑定它?我错过了什么吗?

对不起,但这真的让我头疼..

0 投票
1 回答
548 浏览

ibm-midrange - 如何避免服务程序中出现意外的过程名称冲突?

使用从著名的关于 RPG 异常和错误处理的 IBM 红皮书中学到的概念,我编写了一个服务程序QGPL/ERRFUNC来实现可重用的错误函数,如AssertThrowThrowMsgRethrowGetErrorMsg。我一直在几个不同的程序中使用它们,并且它们运行良好。

刚才,我Throw在一个 RPG ILE 程序中使用了该函数,该程序还静态调用access用于 IFS 文件系统上的流文件的 C 样式函数。该程序将无法编译,并出现“为符号抛出多次提供定义”的绑定错误。据我所知,使用命令编译时无法获取绑定详细信息CRTBNDRPG,但我能够注释掉我的H DFTACTGRP(*NO)规范,然后使用CRTRPGMOD附加CRTPGM参数编译它DETAIL(*EXTENDED)。这将打印出编译器在确定要静态绑定到哪些过程时查看的所有过程名称的扩展列表。这揭示了“投掷”的双重定义。在 72 页列表的深处,IBM 提供的服务程序QJVAJNI(Java Native Interface) 被引用,它包含一个导出的过程,也称为“Throw”。

现在,解决我当前问题的最简单方法是简单地重命名我的“Throw”过程,修改并重新编译我的服务程序,然后修改并重新编译所有引用它的程序。我可能会遵循该解决方案,但这种行为引发了几个令人不安的问题:

  1. 为什么 C 风格的 IFS 函数使用 Java 本地接口来完成它的工作?我看到像这样的服务程序的导入QC2IFSQC2POSIX上下文中完全有意义。看起来 IBM 在这里引入了一个我们必须忍受的意外依赖项。我确信它是引用 的 C 服务程序之一,QJVAJNI因为当我注释掉access函数调用时,QJVAJNI不会引用 。有可能对QJVAJNI服务程序的引用有好几层深,意思是一个导入一个导入。

  2. 为什么绑定器通过服务程序导入如此彻底地递归?活页夹看起来像是经历了每个服务程序使用的每个导入,无论该导入是否被程序和被绑定的子过程使用。那有必要吗?递归检查每个级别使用的导入不是有效吗?有没有办法改变这种行为?

  3. 如果对上述两个问题无能为力,这是否意味着要保证绑定始终有效(特别是对于“通用”功能,如错误处理),必须确保没有任何其他导出的过程机器上的任何地方同名?我不知道有任何设施(如命名空间)可以缓解这个问题。据我所知,ILE 编译器不使用其他平台在这种情况下可能使用的任何方法,例如重载或名称修改。像我在一些 C 导出中看到的那样开始“非正式命名空间”是否是一个好习惯(例如_C_NEU_IFS_feof) 以防止名称冲突?或者,有没有办法在发布服务程序之前搜索机器上所有导出的程序以查找您想要的名称?

  4. IBM 红皮书的作者是 ILE 编程领域的一些重量级人物。他们像我一样将他们推荐的导出之一命名为“Throw”(尽管使用不同的参数列表)。他们是否遇到过类似的问题?他们有不同的方法来解决名称冲突吗?

我发现*DUPPROC可以为 指定一个选项CRTPGM,但我不确定这是一个好主意。文档说“当允许多个重复过程时,指定模块和服务程序列表中与导入请求匹配的第一个导出过程是选择的过程。” 你能确定哪个符号将在列表中排在第一位吗?顺序是否严格定义?

0 投票
1 回答
49 浏览

java - Java中的静态/动态绑定

我有class Person, class StudentStudent extends Person。据我了解,静态绑定如下:

现在,如果我实例化并调用方法:

我的问题:如果只有class Student一个方法怎么办talk(Student s)。现在我打电话talk(x)。既然我通常应该talk()从 获取方法class Person,那么当没有这种方法时会发生什么?

编辑:我试图运行它,它给了我一个编译错误。好的,但是为什么会发生这种情况?我了解到编译器将首先转到子类并搜索该方法,如果它在那里,那么它会被执行吗?

0 投票
0 回答
53 浏览

java - Java中的静态绑定

原以为下面代码的输出应该是ABB,原来是AAB,为什么java在这里做静态绑定呢?

抱歉我可能犯的错误,这是我的第一个问题。

0 投票
1 回答
82 浏览

java - 你能“动态绑定”重载方法吗?

给我们

我想那是由于类型擦除。

我可以对此做任何事情而不必插入显式类型检查或重载bWith吗?

我的意思是,应用程序在运行时知道它应该使用Integer-type 参数调用构造函数,它只是不知道调用正确的构造函数,毕竟......

另外——因为我猜答案是“不”——允许这样的事情会有什么问题?

0 投票
3 回答
88 浏览

java - 为什么这个静态绑定不能像我预期的那样工作?

我有一个关于这个程序如何选择方法的问题。

代码(除了构造函数):

主要的:

我不明白为什么要f2.m(s1)打印 100。就我个人而言,我理解如果有 2 个方法同名,如果有重载,则选择使用静态类型,如果覆盖则使用动态类型;

f1.m(s1)动态搜索Father.m(Son)方法,但它不存在,而是Father.m(Father)被选择

f2.m(s1)动态搜索一个Son.m(Son)存在并且是重载的方法,所以我认为它现在应该优先考虑静态类型并搜索一个Father.m(Son)不存在但最接近的方法是Father.m(Father). 取而代之的Son.m(Father)是选择方法:是被 Son.m(Son) 方法重载的方法,可以,但不是从静态搜索中出来的,那为什么选择它呢?

0 投票
2 回答
70 浏览

java - 绕过java中静态方法的早期绑定

我有一个 AbstractBaseRepository。我所有的存储库都从这个类扩展。我创建了另一个类 RepositoryFactory 来创建 Repository 的任何实例。由于静态方法的早期绑定,我遇到了问题。

一个示例子类

每当我使用 AbstractBaseRepository 的有效子类调用 getRepository() 时,都会引发运行时异常。这是由于静态方法的早期绑定。在编译期间,getNewInstance 与 AbstractBaseRepository 绑定,而不是在运行时与类的实际类型绑定。有什么好的解决方法吗?

0 投票
0 回答
139 浏览

java - 为什么 Java 的方法参数中没有动态绑定?

我想知道为什么 Java 中的方法参数中没有动态绑定?例子:

无论如何都必须确定,变量c是包含类C的实例还是它的子类的实例,为什么不能动态完成呢?

0 投票
0 回答
54 浏览

c# - 静态属性更改在 C# wpf 项目中无法正常工作

我有一个像这样的静态类:

我有一个文本框,它的文本绑定到 HWidth 和一个矩形,它的宽度绑定到 HWidth。如何在更改文本框值时更改此项目,然后更改矩形的宽度?我使用的 Xaml 是这样的:

0 投票
2 回答
69 浏览

c++ - 使用新运算符 c ++ 的静态绑定

我想确定我是否理解正确。如果我有类似的东西:

如果我用静态绑定做到了这一点,那么 wsk 是 Base 类型,但仍然创建了派生类型对象?并且wsk指向该派生类型对象,但它不能使用派生类中的方法,因为wsk是基类型?总结对我来说最重要的问题是,如果wsk除了它的 Base 类型仍然指向 Derived 类型的新对象?