abstract class A{
public A(){
b();
}
abstract void a();
abstract void b();
}
abstract class B extends A{
@Override
void a() {
System.out.println("正在调用B类a方法");
}
@Override
void b(){
System.out.println("正在调用B类b方法");
}
}
class C extends B{
@Override
void b(){
System.out.println("正在调用C类b方法");
}
}
public class Test {
public static void main(String[] args){
new C();
}
}
我们平时在写java时,每天都在创建对象,那么看看上面的例子会不会也很熟悉呢...
创建对象C,在基类的构造器中调用b方法,那么java怎么会知道该调用在B类实现的b方法呢,还是在C类中实现的b方法呢?
上面程序会输出"正在调用C类b方法",没错,不是“正在调用B类b方法”,这是因为java的动态绑定决定的,假象一下,在A类的构造器中,在调用b方法时,A类会说是谁在调用我,其实在实例化C时,注册了C对象的this,A的构造器会用c的对象调用b()。