困惑多态性实际上是如何工作的(方法重载/静态绑定)和(方法覆盖/动态绑定)[重复]

问题描述 投票:0回答:0

编译期间从哪里开始实际检查? & 在运行时会发生什么?

众所周知,静态绑定是在编译期间发生的绑定。

现在从上图中‘a1’是A类类型的引用变量,指向A类的对象。‘a2’也是A类类型的引用变量,但指向B类的对象。

因此,在编译期间,在绑定时,编译器不会检查特定引用变量所指向的对象的类型。它只是检查调用方法的引用变量的类型,并检查该类型中是否存在其方法定义。

对于示例,对于上图中的“a1.method()”方法调用,编译器会检查A类中是否存在method()的方法定义。因为‘a1′是A类类型。同样,对于“a2.method()”方法调用,它会检查A类中是否存在method()的方法定义。因为'a2'也是A类类型。

现在据我所知,“a2.method()”应该从B类调用,因为覆盖方法,因此在运行时JVM将识别该方法为B类。所以按照上面的例子(*某人说了这一点,我正在使用该示例消除我的疑虑*)它说在静态绑定编译器中不会检查特定引用变量所指向的对象的类型,那么我的问题是编译器将如何找不到 “a2.method()” ???如果只检查 A 类参考。

现在他说**动态绑定**是在运行时发生的绑定。

对于示例,对于上图中的“a1.method()”调用,将调用‘a1’所指向的实际对象的method()。对于 “a2.method()” 调用,将调用 ‘a2’ 所指向的实际对象的 method()。这种类型的绑定称为动态绑定。

我的问题是,所以在静态绑定期间它会检查调用方法的引用变量的类型?在动态绑定中,它将调用‘a2’所指向的实际对象的method()。 ?

告诉我关于静态绑定以及编译器如何无法在类A中找到“a2.method()”(如果它只是通过调用哪个方法来检查引用变量的类型)。如果我理解这一点,那么动态绑定也会被清除

java polymorphism dynamic-binding static-binding
© www.soinside.com 2019 - 2024. All rights reserved.