结论
属性没有动态绑定机制,在哪个类声明,就在哪个类使用,但是同样是遵循继承机制,若子类没有该对象,会向其父类寻找。当调用对象方法时候,该方法会和该对象的类型地址/运行类型绑定,也就是看运行类型为什么类型,则从该类型的类调用方法。如运行类型为子类,则方法从子类调用,不会调用父类的同名方法,若子类没用该方法,则会向上寻找该方法。废话不多说,直接上代码。大家可以拿我的代码自己去调试一下,把子类的方法和属性屏蔽一下,可以更好的理解动态绑定。
/**
* @Author: Ming
* @Function: java动态绑定机制复习
* @Date: 2022/11/10/21:09
*/
public class dynamic {
public static void main(String[] args) {
A a = new B();
System.out.println(a.i);//10
System.out.println(a.sum());//40
System.out.println(a.sum1());//30
System.out.println("=======");
B a01 = (B)a;
System.out.println(a01.i);//20
System.out.println(a01.sum());//40
System.out.println(a01.sum1());//30
}
}
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 sum1(){
return i + 10;
}
public int getI(){
return i;
}
}
运行结果如下
10
40
30
=======
20
40
30