猿问

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

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


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都将被静态绑定处理,并且它们将链接到A类方法show(因为引用的类型是A)。但在运行时,调用被解析,line1 链接到 A 类方法 show(),line2 链接到 B 类方法,即对象类型,或者我们可以说动态绑定。

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

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

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

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


慕田峪7331174
浏览 64回答 1
1回答

jeck猫

基本上,每次调用方法时,编译器都必须根据传递给方法的类型和参数来确定要调用哪个重载。这是静态绑定。然后在运行时,运行时将确定要调用哪个重载实现(此时已经决定)。考虑: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("");会发生什么?f(Object)在编译时,编译器根据a存在的类型选择了重载A(只有一种方法可供选择!)。然后在运行时,由于a实际上引用了 的实例B,因此调用重载B的实现,打印。我见过的一种误解是期望输出为. 这是错误的,因为编译器不知道.f(Object)From B (Object)From B (String)a动态绑定总是在静态绑定之后产生吗?从上面代码的结果我们可以看出,答案是肯定的。静态绑定发生在编译时,动态绑定发生在运行时,因此前者总是先发生。如果这是真的,那么每个方法在运行时都是动态链接的说法是真的吗?我不确定你的意思,所以希望上面的详细解释已经回答了这个问题。不管怎样,每次方法调用总是会有静态绑定,然后动态绑定?是的,但有时这两个过程可能会进行得很快,因为选择很少。当您调用方法的类是最终类时,您可能不需要在动态绑定中做出“选择”,是吗?
随时随地看视频慕课网APP

相关分类

Java
我要回答