[英]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();
编译器将虚拟调用指令( invokeVirtual
或invokeInterface
)用于可以被覆盖的方法(它们不能是静态的或私有的)。 在此代码中,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.