开发测试学习
目录

当你用点操作符调用一个对象实例的成员函数时,对象实例所属的类在编译时要被检查,以确保调用的成员函数在该类中是存在的。在运行时,对象实例可以指向所声明类型的子类的实例。在这?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成员函数里