java的多态相信大家并不陌生,但说到多态的动态绑定机制,可能就不有所不解了
下面有段代码可以让你了解什么是动态绑定机制
package com.hmdstu.poly_.dynamic_;
/**
* @author XXX
* @version 1.0
*/
public class DynamicBinding_Stu {
public static void main(String[] args) {
//编译类型为 A,运行类型为 B
A a = new B();
a.sum();
}
}
class A{
private int n1 = 10;
public void sum(){
System.out.println(getN1() + n1);
}
public int getN1() {
return n1;
}
}
class B extends A {
private int n1 = 100;
public void sum(){
System.out.println(getN1() + n1);
}
@Override
public int getN1() {
return n1;
}
}
代码解读:
有一个类A,以及一个类B并且继承了类A,并且子类B重写了父类A中的sum()方法,并且同时拥有一个int类型的属性n1。main()方法中用多态的形式 A类对象的引用a指向了子类对象B的一块堆空间,这个时候用引用a调用了sum()方法,这里首先会看编译类型A中是否存在sum()方法,如果存在,在看运行类型B中是否存在sum()方法,如存在,就调用,反之调用更具继承关系去找父类中找,直到找到为止。最后通过B类sum()方法得到 B类中getN1()+n1 为 200
如将B类中sum()方法去掉,会有什么结果?
package com.hmdstu.poly_.dynamic_;
/**
* @author XXX
* @version 1.0
*/
public class DynamicBinding_Stu {
public static void main(String[] args) {
//编译类型为 A,运行类型为 B
A a = new B();
a.sum();
}
}
class A{
private int n1 = 10;
public void sum(){
System.out.println(getN1() + n1);
}
public int getN1() {
return n1;
}
}
class B extends A {
private int n1 = 100;
// public void sum(){
// System.out.println(getN1() + n1);
// }
@Override
public int getN1() {
return n1;
}
}
去除B类中sum()方法后的代码解读:
这个时候你会发现变成了110,为什么不是20呢?
因为这个时候再通过引用a来调用sum()方法时,因为对象B中没有,所以根据继承关系找到父类A中的sum()方法,关键来了,这个时候输出调用的getN1()方法会更具动态绑定机制的原理也会先从运行类型B中寻找是否有getN1()方法,然后在去更具继承关系向上查找,所以得到的getN1的值就为100,因为属性看编译类型,所以这个sum方法中的n1调用的就是编译类型A中的属性n1,自然n1就等于10所以最后结果为110