动态绑定机制 java的动态绑定机制: 当调用对象方法的时候, 该方法会和该对象的内存地址/运行类型绑定 ; 当调用对象属性时, 没有动态绑定机制 ,在哪个类中声明就用哪个类中的
java的动态绑定机制:
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定;
- 当调用对象属性时,没有动态绑定机制,在哪个类中声明就用哪个类中的属性;
代码示例:
package com.hspedu.poly_.dynamic_;
/**
* @author gaoqinghui
* @date 2022/4/15 15:31
* java的动态绑定机制
* 1.当调用对象方法时,该方法会和该对象的内存地址/运行类型绑定
* 2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
*/
public class DynamicBinding {
public static void main(String[] args) {
//A是a的编译类型,B是a的运行类型
A a = new B();
//解释:当调用a.sum()时,我们的运行内存是B,首先会去子类中寻找看是否有sum方法,这时我们把子类中的sum方法注释了,根据继承关系,会继续向上寻找父类看是否有sum这个方法,这时父类A中有sum这个方法,调用这个方法后,返回的时geti() + 10,根据动态绑定机制,这时会根据我们a的运行内存去寻找这个geti()方法,a的运行类型时B,就去B中找是否有geti(),这时找到,返回i,因为返回i是属性,属性没有动态绑定机制,返回的就是就是B类中定义的i,也就是20,然后返回父类,结果为30;
System.out.println(a.sum());
System.out.println(a.sum1());
}
}
class A {
public int i = 10;
public int sum(){
return geti() + 10;
}
public int sum1(){
return i + 10;
}
public int geti(){
return i;
}
}
class B extends A { //子类
public int i = 20;
// public int sum(){
// return i + 20;
// }
public int geti(){
return i;
}
// public int sum1(){
// return i + 10;
// }
}