我对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();
}
}
答案 0 :(得分:4)
就在这里
A q = new B();
q.show();
编译器使用虚拟调用指令(invokeVirtual
或invokeInterface
)来表示可以覆盖的方法(它们不能是静态的或私有的)。在此代码中,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
的类型为B
,B
会覆盖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();