首先我们运行以下一段代码,结果大家很容易看出来结果为40与30。但是如果我将B类的sum方法注释掉那么他将会输出什么???会发现最终的结果变为30与30,其中间发生了什么??
- 首先输出时检索子类B中没有sum类,就去调用父类A的sum,但是我们会发现A的sum函数包含了getl()函数,我们这个时候使用子类的getl方法还是父类的getl方法???
- Java的的动态绑定机制,在这个函数中A a=new B(),其就与B(等号后面的)的地址进行绑定,这个时候B中含有getl函数,就去调用B中的函数。而i=20,getl=20,sum=20+10=30。
package com.zss.Mlearn;
public class A {
public int i=10;
public int sum(){
return getl()+10;
}
public int sum1(){
return i+10;
}
public int getl(){
return i;
}
}
package com.zss.Mlearn;
public class B extends A{
public int i=20;
@Override
public int sum(){
return i+20;
}
@Override
public int getl(){
return i;
}
@Override
public int sum1(){
return i+10;
}
public static void main(String[] args) {
A a=new B();
System.out.println(a.sum());
System.out.println(a.sum1());
}
}