class One{
public One foo(){
return this;
}
}
class Two extends One{
public One foo(){
return this;
}
}
class Three extends Two{
//代码段1
/*public One foo(){
return this;
}*/

//代码段2
/*public Two foo(){
return this;
}*/

//代码段3
/*public Three foo(){
return this;
}*/

//代码段4
/*public Object foo(){
return this;
}*/


}
每次只插入注释的一段代码,你们懂的!!
代码段1,2,3单独的插入没有任何问题
我就是很弄不明白为什么代码段4插入就出现编译错误了啊???
每次只插入注释的一段代码,你们懂的!!!

解决方案 »

  1.   

    Override! 方法返回类型可以是协变类型,就是说 override的方法你可以返被override方法返回类型的子类型,你的代码里 你可以返回 One Two There,所以你的 代码1,2,3 都是Override。 但是代码4, 你的返回类型是Object。 Object可不是One的子类型,但是方法名称却一样(foo())这里就不是Override了,而是“Overload”了,再但是java和C++不一样,只有返回类型不一样的方法是不符合Overload的规则的。所以代码4既不是Override 也不是Overload。所以编译器报错了。
      

  2.   

    简单点,代码1,2,3 符合Override的规则,是方法的重写,4 既不符合Override的规则也不符合Overload的规则。所以编译器报错。应该是“重复的方法XXXX...”这样的错误信息之类的吧。
    Override 和Overload的规则 详情参见 JSL 8.4.8 和 8.4.9 两节内容。
    附上下载地址
    再附上在线阅读地址
      

  3.   

    由于在父类中的foo方法的返回类型是One
    而在Three中复写Two中的foo方法的返回类型是object类型 与父类中的返回类型不符
    由于Two中包含One,Three中也包含One 但是Object中不包含One所以前三个可以编译成功 第四个代码段就不行了