java中的动态绑定?

时间:2014-01-06 05:57:46

标签: java inheritance method-overriding

我对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();
}
}

5 个答案:

答案 0 :(得分:4)

就在这里

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

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

show in A

答案 1 :(得分:2)

我想我以前把你弄糊涂了。

动态(或后期)绑定是Java中实现多态的方式。它在任何时候调用实例方法时都会发生。

在您的示例中,我们对此处的事件感兴趣

p.show();

在这里

q.show();

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

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

例如

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

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


在我评论的答案中,重写方法没有发挥作用。这更像是构造函数执行顺序的问题。

答案 2 :(得分:0)

在以下行中调用的方法show()

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

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

答案 3 :(得分:0)

您可以在main方法中更改它以实现多态或动态绑定:

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

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

正如你所知道的那样,即使引用永远不会改变A a,但它所引用的内容会发生变化,因为它指向不同的实例,差异行为将会完成!
这就是所谓的polymorphism

在java中使用reflect之后,很多强大的多态性会让你沉醉!玩得开心!

答案 4 :(得分:0)

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

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

- 编译器无法了解哪个method call与哪个method body相关联......所以 >方法调用的责任将自身与其相应的方法体相关联。

- 了解Fields(实例变量)在自然界中不是多形态非常重要。

在您的情况下,动态绑定在此处:

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