为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2023-09-13 18:03:39
我对主题绑定很困惑。正如我们所知,在静态绑定中,会检查引用的类型来确定绑定,而不是它所引用的对象,而在动态绑定中,会考虑引用所指向的对象的类型。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 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

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


考虑:


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

动态绑定总是在静态绑定之后产生吗?

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

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

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

不管怎样,每次方法调用总是会有静态绑定,然后动态绑定?

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


查看完整回答
反对 回复 2023-09-13
  • 1 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信