黑马程序员技术交流社区

标题: 方法覆盖的一个问题 [打印本页]

作者: 于世德    时间: 2013-7-20 16:21
标题: 方法覆盖的一个问题
  1. public class Fu{
  2. int getMax(int[] arr){
  3. return arr[0];
  4. }
  5. }
  6. class Zi extends Fu{
  7. long getMax(int[] arr){
  8. return arr[1];
  9. }
  10. }
复制代码
在方法返回值不同时,子类为什么不可以覆盖父类的getMax方法呢?

作者: ㄗs:/|丶hearts    时间: 2013-7-20 16:38
那不是覆盖  那是重载
作者: wedge    时间: 2013-7-20 16:52
什么是重载,重写概念。。。
重载是Java实现多态技术的重要手段,为编程带来了很多便利
当方法同名时,为了让编译器区别他们,至少需要下面之一不同
1 参数个数不同
2 对应位置上的参数类型不同
不允许参数完全相同而只是返回值不同的情况出现。无法进行编译,程序在eclips中显示错误
重写的话,除方法体内可以不一样外,方法的定义,参数,返回值类型都是需要一样的。
作者: 赵太云    时间: 2013-7-20 17:50
子类覆盖父类的方法,除了修饰符的权限要比父类高外,虽的都要一样,方法体可以不一样。。。。。。。。。
作者: longlangcx    时间: 2013-7-20 19:41
为什么不能,因为不允许这样做,为啥不允许,想应用就好了。

继承的一个重要目的就是利用向上转型、多态性来解耦合、提高扩展性。
你这个Fu要的是一个int类型的值,那么子类向上转型之后,我调用这个方法就需要得到一个int或者可以当int用的值,而你的子类返回的是一个long,long可以当int用么?当然不行,int可以存入int数组,long可以么~

所以java才规定覆盖方法的返回值必须是原类型或者是其协变返回类型(1.5之后),为啥协变返回类型可以?因为协变返回类型可以当其父类型用,比如父类返回类型为Person,你子类型覆盖方法返回一个Student,向上转型之后,我要求给我一个Person,你给了我一个Student,可以么?可以!因为Student is a Person,Person能干的事儿Student都能干。
作者: 于世德    时间: 2013-7-21 12:01
ㄗs:/|丶hearts 发表于 2013-7-20 16:38
那不是覆盖  那是重载

什么!!!!!!:funk:
作者: 于世德    时间: 2013-7-21 12:04
wedge 发表于 2013-7-20 16:52
什么是重载,重写概念。。。
重载是Java实现多态技术的重要手段,为编程带来了很多便利
当方法同名时,为 ...

:L这些我知道,我问的是为什么方法返回值不同就不可以重写了,请解释一下内部机制把
作者: 于世德    时间: 2013-7-21 12:09
longlangcx 发表于 2013-7-20 19:41
为什么不能,因为不允许这样做,为啥不允许,想应用就好了。

继承的一个重要目的就是利用向上转型、多态性 ...

如果我把long换成short就可以了把?
作者: longlangcx    时间: 2013-7-21 17:27
于世德 发表于 2013-7-21 12:09
如果我把long换成short就可以了把?

:L
不行的,人家规定只能是原类型或者协变返回类型,你就按照规定来呗。

要求int你给返回short,也不符合要求的。不是协变返回类型,只有原类型或者子类才算协变返回类型。

再给你举个例子吧,比如我向上转型后调用你那个声明为返回int的方法,把返回值作为参数传递给一个show()方法,而这个show()方法有多种重载形式,声明的是int,那么理应运行show(int i)这个方法,而你非给人家一个short,那么作为参数传递给show方法的话,很可能匹配的是show(short sh)方法,这样就产生了错误的结果了吧。
作者: 于世德    时间: 2013-7-22 09:49
longlangcx 发表于 2013-7-21 17:27
不行的,人家规定只能是原类型或者协变返回类型,你就按照规定来呗。

要求int你给返回short,也不符 ...

不知道自己为啥这块想不通:D,算了
作者: wedge    时间: 2013-7-22 10:19
于世德 发表于 2013-7-21 12:04
这些我知道,我问的是为什么方法返回值不同就不可以重写了,请解释一下内部机制把 ...

返回值不一样,还能叫重写?重写的概念你再去看看!!!
作者: Mr_Free    时间: 2013-7-27 21:15
覆盖的前提是 方法名  返回值类型一样,参数列表一样才能覆盖;
你父类里面定义的返回值类型是int  子类是long,所以不能覆盖。
这样的方法不能同时存在于子父类中,因为,子类在调用该方法时,他 不知道返回什么值的类型

这里顺带给你说一下函数的重载:  他的前提是函数名一样,参数列表可以不同,他跟返回值类型没关系,只要你符合前面2个条件,他就能存在与子父类中,甚至同一个类中。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2