class Poem { void perform() { System.out.PRintln("白日依山尽"); } }
class ShakespearePoem extends Poem { void perform() { System.out.println("To be or not to be."); } }
class Hamlet extends ShakespearePoem { }
那么,
Poem poem = new Hamlet(); poem.perform();
将输出“To be or not to be.”。这是因为perform的方法体是运行时才确定的。虽然Hamlet没有提供perform的方法体,但它从ShakespearePoem继续了一个。至于为何不用Poem定义的perform方法,那是因为ShakespearePoem定义的perform已经覆盖了它。我们可以随时修改Hamlet,却无需重新编译ShakespearePoem,如下例所示:
class Hamlet extends ShakespearePoem { System.out.println("连一支耗子都没闹"); }
现在,前面的例子将输出“连一支耗子都没闹”。但是,
Poem poem = new ShakespearePoem(); poem.perform();
这段代码的输出结果是“To be or not to be.”假如我们删除ShakespearePoem的内容,同样的代码将输出“白日依山尽”。