java - 是否可以说每个运行时绑定(bind)都是编译期间的静态绑定(bind)?

标签 java polymorphism overriding overloading static-polymorphism

我对主题绑定(bind)很困惑。 正如我们所知,在静态绑定(bind)中,会检查引用的类型来确定绑定(bind),而不是它所引用的对象,而在动态绑定(bind)中,会考虑引用所指向的对象的类型。

class A
{
    void show()
    {
        System.out.println("From A");
    }
}
class B extends A
{
    void show()
    {
        System.out.println("From B");
    }
}
class Main
{
    public static void main(String[] quora)
    {
        A a1 = new A();
        A a2 = new B();

        a1.show(); //line 1
        a2.show(); //line 2
    }
}

在上面的例子中,我们可以看到在编译时,Line1和line2都将被静态绑定(bind)处理,并且它们将链接到A类方法show(因为引用的类型是A)。 但在运行时,调用被解析,line1 链接到 A 类方法 show(),line2 链接到 B 类方法,即对象类型,或者我们可以说动态绑定(bind)。

所以我的主要目的是了解以下内容。

  1. 动态绑定(bind)总是在静态绑定(bind)之后产生吗?或者我理解有问题?

  2. 如果这是真的,那么每个方法在运行时都是动态链接的说法是否正确?

  3. 我们可以概括一下吗?

最佳答案

基本上,每次调用方法时,编译器都必须根据传递给方法的类型和参数来确定要调用哪个重载。这是静态绑定(bind)。然后在运行时,运行时将确定要调用重载的哪个实现(此时已经决定)。

考虑:

class A
{
    void f(Object o)
    {
        System.out.println("From A");
    }
}
class B extends A
{

    void f(Object o)
    {
        System.out.println("From B (Object)");
    }

    void f(String s)
    {
        System.out.println("From B (String)");
    }
}

你也这么做了:

A a = new B();
a.f("");

会发生什么?在编译时,由于 a 的类型为 A(只有一种方法可以实现),编译器选择了重载 f(Object)。从中选择!)。然后在运行时,由于 a 实际上引用了 B 的实例,因此 B 实现了 f(Object) 重载被调用,打印 From B (Object)。我见过的一个误解是期望输出是来自 B(字符串)。这是错误的,因为编译器不知道 a 上是否存在此重载。

Is dynamic binding always results after static binding?

从上面代码的结果我们可以看出,答案是肯定的。静态绑定(bind)发生在编译时,动态绑定(bind)发生在运行时,因此前者总是先发生。

If it's true then is it true to say every method is dynamically linked during the run time?

我不确定你的意思,所以希望上面的详细解释已经回答了这个问题。

no matter what, there's always gonna be static binding and then dynamic binding for every method call?

是的,但有时这两个过程可能会进行得很快,因为选择很少。当您调用方法的类是最终类时,您可能不需要在动态绑定(bind)中做出“选择”,是吗?

关于java - 是否可以说每个运行时绑定(bind)都是编译期间的静态绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58185666/

相关文章:

scala - 困惑重新 : solution to fibonnaci numbers with Scala infinite streams that used a def'd method within a def

ios - 从 Objective-C 的角度来看 "over ride"是什么意思?

java - Hibernate 在绑定(bind)到 Java 时间戳对象时忽略数据库时区信息

Java - 将 WAV 文件读取为 float 组

javascript - 在javascript es6中,如何在不使用类名的情况下调用构造函数方法?

javascript - 覆盖 craftyjs 中的函数

java - 如何交错Java 8 Stream?类似于 Collectors.joining() 但对于字符串以外的东西

java - 调用中断后锁释放

c++ - C++继承使用不同的参数重载函数

c++ - 嵌套结构属性继承