我们看一下如下的程序代码Test.java class Base { public Base newInstance() { return new Base(). } public Base newInstance2() { return new Base(). } } class Test extends Base { // 返回值不同 public Test newInstance() { return new Test(). } // 返回值相同 public Base newInstance2() { return new Test(). } } class Base { public Base newInstance() { return new Base(). } public Base newInstance2() { return new Base(). } } class Test extends Base { // 返回值不同 public Test newInstance() { return new Test(). } // 返回值相同 public Base newInstance2() { return new Test(). } } 这段代码到底对不对呢?能否编译通过呢? 在JDK5.0以前,Override要求参数列表和返回值必须完全相同,否则编译不通过,所以在jdk 1.3、 1.4里面,这个代码是错误的。 Test里面的newInstance 的返回值必须修改为为父类完全相同的Base才可以。 而在JDK1.5以后,系统允许返回值和父类不同了,但必须是其子类才可以。这个问题我也是在实际编程时才注意到的。 当然,目前的大部分书籍还是老版本的,如果对大家产生了什么疑问,那么自己写一个代码亲自验证一下才是正确的。书籍里的知识有一些随着时间的流逝,肯定会过时的。