目录
- 第一卷
- 第二卷
当你用点操作符调用一个对象实例的成员函数时,对象实例所属的类在编译时要被检查,以确保调用的成员函数在该类中是存在的。在运行时,对象实例可以指向所声明类型的子类的实例。在这?copy;情况下,如果子类覆盖了要调用的成员函数,Java就用实例来决定调用哪一个成员函数。如下面的例子,两个类是子类和超类的关系,子类覆盖了超类的成员函数。
classA{
voidcallme(){
System.out.println(\"在A的callme成员函数里\");
}
}
classBextendsA{
voidcallme(){
System.out.println(\"在B的callme成员函数里\");
}
}
classDispatch{
publicstaticvoidmain(
Stringargs[]){
Aa=newB();a.callme();
}
}
有趣的是,在成员函数main里,我们把变量a声明为类型A,然后把类B的一个实例存放到它上面。我们在a上调用成员函数callme,Java编译器确定在类A确实有成员函数callme,但是在运行时,由于a事实上是B的实例,所以调用B的callme,而不调用A的。下面是运行结果:C:\>javaDispatch在B的callme成员函数里