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

Java编译器如何在继承中选择正确的方法和变量

宋琛
2023-03-14
问题内容

当继承与类型转换混合在一起时,我有点困惑。我想了解在继承中选择正确的方法和变量时java编译器遵循的规则。

我读过类似的东西

变量在编译时绑定,方法在运行时绑定。

重载分辨率 (称为方法签名)是在编译时根据方法目标和参数表达式的编译时类型确定的

该方法签名( 覆盖 )的实现基于执行时目标对象的实际类型。

但是问题在于它们只是对特定情况的解释,没有考虑其他因素(例如异常处理)时要遵循的一般过程。

这可能是不好的作法,但假设方法和变量都被覆盖(在static变量的情况下被隐藏)。

现在,如果Java编译器必须在编译时选择需要调用哪种方法/变量,那么它将遵循哪种算法?同样,在运行时,java编译器将使用什么算法(基于正在使用其引用的对象的实际类型)?


问题答案:

所有方法签名和变量都在编译时进行验证,但实际的方法调用在运行时完成/解析。

例如 :

class A {
int i=5;
public void doSomething(){
//print "in A"
}
}

class B extends A{
int i=10;    
public void doSomething(){
// print "in B"
}

public static void main(String[] args){
A a = new B();
a.doSomething();
}
}

现在,当您调用时a.doSomething();,在编译过程中,编译器仅检查是否doSomething()为类A定义了(lhs参考)。甚至不必担心是否也为类B定义了该方法。即使该方法不存在B,该程序也可以正常编译。

接下来,在运行时,JVM根据对象的类型(B根据您的情况)动态决定要调用的方法。

因此,"in B"被打印。

现在,回到领域。在编译期间将解决对字段的访问。因此,如果在编译期间不存在任何字段,则编译将失败。这些字段根据引用类型进行调用。因此,a.i将打印5A'si),因为该字段在编译时已解决。因此,不同之处在于,方法调用在运行时解析,在编译时需要/检查其签名,而在编译时则检查/解析字段。



 类似资料:
  • 我的目标是创建一个抽象类,它的静态方法必须被实现,但是由于静态方法不能被抽象,我有一些问题。 这就是我提出的解决方案: 我写这篇文章是因为我找不到任何等价的答案,这让我想知道这在Java中是否是惯用的。

  • 问题内容: 我已经阅读了很多有关javascript中“继承”的文章。其中一些使用,而另一些则建议。我读得越多,我就越困惑,因为它似乎存在着无穷无尽的变体来解决继承问题。 有人可以告诉我最可接受的方式吗(如果有的话,是事实上的标准)吗? (我想要一个可以扩展或的基础对象。) 问题答案: 简单:并非在所有环境中均受支持,但可以填充。除此之外,两者具有不同的目的:只需创建一个对象从其他继承,同时 还

  • 问题内容: 我在对Postgres数据库使用github.com/bmizerany/pq。我需要选择“ todos”表中的所有行,并为每一行检查条件并相应地更新行。伪代码: UpdateTask()函数将发出一条SQL更新语句来更新该行。 在SELECT查询中发出SQL更新是否会锁定数据库?这是进行这种更新的正确方法吗? 问题答案: 首先, 至少 您应该这样做,以防止其他访问锁定行。您必须在事务

  • 问题内容: 我在使用webstorm打字稿编译器时遇到问题。我有以下课程 因此,键入“ super”,我会在智能感知中看到所有rootData公共方法。但是在设置super.insert()之后,出现以下错误: TS2340:仅可通过’super’关键字访问基类的公共和受保护的方法 在TS游乐场中尝试过,它正在工作(认为是简化版本)。 谢谢你的帮助。 编辑:检查编译的javascript后,超级方

  • 具有以下类别: 和 和 和 和 和 因此,应用程序需要动态实例化步骤子类对象,相应地设置配置并运行步骤,如下所示。 错误消息: "方法setConfig(捕获#8-of?扩展Config)在类型Step中 查看文档,在这种情况下,Java看起来不友好:https://docs.oracle.com/javase/tutorial/java/generics/wildcardGuidelines.h

  • 问题内容: 我需要帮助为具有较长实际名称的变量选择适当的名称。我已经阅读了pep8文档,但找不到解决此类问题的方法。 您将重命名为类似名称还是将其保留原样。我注意到库中构建的python的名称非常短,如果这种情况存在,我想遵循约定。 我知道我可以给它起一个不太具描述性的名称,并添加描述,这可以解释其含义,但是您认为变量名称应该是什么。 问题答案: PEP8建议使用简短的变量名,但是要做到这一点需要