说这个绑定机制之前大家先看一道题
public class Demo01 {
public static void main(String[] args) {
A a = new B();
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 getI() + 20;
}
public int getI() {
return i;
}
public int sum1() {
return i + 10;
}
}
请大家在心里记住num和num1两个数分别是多少再看下面的代码:
public class Demo01 {
public static void main(String[] args) {
A a = new B();
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 getI() + 20;
}*/
public int getI() {
return i;
}
public int sum1() {
return i + 10;
}
}
到这里我公布以下答案:第一个代码块的num = 40; num1=30;
第二个代码块的num=30; num1=30;
大家做对了吗?
那么如果第二到没有做对的话,让我帮你捋一下思路,在做这个小题的时候首先我们要知道一点,父类的引用类型指向子类对象,可以调用子类重写后的方法和父类本身的方法。但是属性没有重写之说!属性的值看编译类型,这点很重要!!!
即代码块1的父类A调用的num和num1都是子类自己的属性和自己重写后的方法,而代码块2把num方法注释掉后,父类A再想调用num方法就只能调用自己的,但是在运行到return getI() + 10;的时候,发现子类当中有getI()这个方法,所以兜兜转转又回去把子类中的getI()这个跑了一遍获取子类当中的int i = 20;然后getI()+ 10 ----->20+10;所以30的这个结果就出来了!
没有看懂可以多看几遍,有条件的可以自己动手敲敲,记住属性没有重写之说!父类调用的只能是子类重写的方法,不能调用属性!!
这就是比较简单的动态绑定机制。