繁体   English   中英

Java中的动态绑定?

[英]Dynamic binding in java?

我对Java中的动态绑定有些困惑。 这是一个程序,我想知道,是否发生了动态绑定或其他情况。 什么是动态绑定?

class A {
int a;

public A() {
    a = 9;
}

public void show() {
    System.out.print("show in A ; ");
    System.out.println("a : " + a);
}
}
public class B extends A {
public B() {
    a = 8;
}

public void show() {
    System.out.print("show in B ; ");
    System.out.println("a : " + a);
}

public static void main(String[] args) {
    B p = new B();
    p.show();

    A q = new B();
    q.show();
}
}

它在这里

 A q = new B();
 q.show();

编译器将虚拟调用指令( invokeVirtualinvokeInterface )用于可以被覆盖的方法(它们不能是静态的或私有的)。 在此代码中,JVM检测到A.show是虚拟的,并检查q的实际类型。 由于它是B因此称为B.show 如果是静态的,JVM将调用A.show ,我们将看到

show in A

我想我以前很困惑。

动态(或后期)绑定是在Java中实现多态的方式。 每当调用实例方法时就会发生这种情况。

在您的示例中,我们对这里的事件感兴趣

p.show();

和这里

q.show();

在编译时,将检查变量的静态类型,以查看方法show()是否可访问,否则无法访问。

在运行时(动态),将检查对象的运行时(动态)类型以找到该方法的实现。 如果找到一个,则使用它,否则,JVM继续查找继承层次结构。

例如

A q = new B();
q.show();

在运行时, q的类型为B并且B覆盖show()因此调用B#show()


在您评论过的答案中,重写方法没有起作用。 更多的是构造函数执行顺序的问题。

下面几行中调用的show()方法

A q = new B();
q.show();

show方法的目标对象在运行时确定。

您可以在main方法中对其进行更改以实现多态或动态绑定:

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

    a = new B();       
    a.show();
}

如您所知,即使引用永远都不会改变A a但是引用的内容也会改变,因为它指向的是不同的实例,所以行为会有所不同!
这就是所谓的polymorphism

强大的多态性,在Java中使用reflect后会沉迷于您! 玩得开心!

-绑定行为 method call identifying and calling its method body

-Java仅支持动态绑定, 少数例外情况除外

- 编译器无法理解哪个method call与哪个method body相关联...因此,方法调用职责是将自身与相应的方法主体相关联。

-重要的是要知道Fields (实例变量)在自然界不是多态的。

您的情况是动态绑定在这里:

 A q = new B();
 q.show();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM