A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孟群峰 中级黑马   /  2013-5-3 16:45  /  1948 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孟群峰 于 2013-5-4 09:09 编辑

为什么不能重载只有返回值类型不同的方法呢?求详解,最好有例子说明,谢谢了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

13 个回复

倒序浏览




重载的说明: 只与参数列表有关 与返回值无关。
楼主说的 : 为什么不能重载只有返回值不同的方法  

代码示例:

public void show(int x,int y)
public int show(int x, int y )
上面这两个方法只有返回值不同 第二个不能重载第一个方法 第一个也不能重载第二个方法
因为  只有返回值不同 而其它参数都相同的方法JAVA虚拟机会认为这是同一个方法   一模一样的方法当然不能重载  

当然这样的两个函数是不能存在于一个类中的,因为当虚拟机去调用方法时 不知道到底调用了哪个Show方法  会报错!                    






评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
  1. void f(){}

  2. int f() {reurn 1;}
复制代码
只要编译器可以根据语境明确判断出语义,比如在int x =f()中,那么的确可以据此却分重载方法。不过,有时你并不关心方法的返回值,你想要的是方法调用的其他效果,这时你可能会调用方法而忽略其返回值。所以,如果像下面这样调用方法:
     f();
此时Java如何才能判断该调用哪一个f()呢?因此,根据方法的返回值来区分重载方法是行不通的。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼上已经解答得很详细了。为了积分,楼主耐心再看一遍吧,哈哈。我顺便也复习复习。

楼主说的就是这种情况吧:
public void method(int  x) {
         ......
};
public int method(int y) {
         ......
};
重载的判断条件是函数名相同,参数列表不同(参数类型、参数个数、参数顺序)。
重载函数返回值类型相同与否无所诶,但是参数列表必须不同,这样才可以构成重载。

如果这两个方法存在于同一个类中,因为函数名字都是一样的,参数列表也一样。jvm会
认为这是同一个方法。运行时,jvm报错会提示,已经在类中定义了该方法。

也可以理解成重载可以决定返回值类型,但是返回值类型不能决定重载。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
多多看视频,慢慢的就能理解了。
函数的重载(overload)
  概念:在同一个类中,允许存在一个以上的同名函数,只有他们的参数个数或者参数类型不同即可。
  特点:与返回值类型无关,只看参数列表。
  好处:方便阅读,优化了程序设计。
  什么时候用重载?
  当定义的功能相同,但参与运算的未知内容不同。
  那么,这时就定义一个函数名称以表示起功能,方便阅读,
  而通过参数列表的不同来区分多个同名函数。

void show(int a,char b,double c){}

a.
void show(int x,char y,double z){}//没有,因为和原函数一样。

b.
int show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。
c.

void show(int a,double c,char b){}//重载,因为参数类型不同。注意:重载和返回值类型没关系。

d.
boolean show(int c,char b){}//重载了,因为参数个数不同。

e.
void show(double c){}//重载了,因为参数个数不同。

f.
double show(int x,char y,double z){}//没有,这个函数不可以和给定函数同时存在与一个类中。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我想楼主对重载的概念已经掌握了,郁闷的是为什么返回值不同不能重载,那好我们来假如一下,如果返回值不同可以重载,当你调用函数的时候,是对象.方法名(参数列表),或者被静态修饰的方法是类名.方法名(参数列表);可是你调用方法根本没有提到返回值类型啊!虚拟机根本不知道你要那个返回值类型,所以如果返回值类型不同可以重载虚拟机会无法识别你要调用的方法,它就报错, 所以返回值类型不同不可以重载。
回复 使用道具 举报
尹桥印 发表于 2013-5-3 16:59
首先你要明确重载的概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同 ...

头像拿走  嘎嘎~
回复 使用道具 举报
尹桥印 发表于 2013-5-3 22:35
随便拿~~哈哈

大好人 大牛人 准备在哪期学习啊  还是正在黑马学习:lol
回复 使用道具 举报
尹桥印 发表于 2013-5-3 22:38
菜鸟一只。准备24期。嘎嘎

:L还早呢 。。。。。 不过到时候你肯定就是牛人了  加油了:lol
回复 使用道具 举报
尹桥印 发表于 2013-5-3 16:59
首先你要明确重载的概念:在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同 ...

那参数类型的先后顺序不同,是否也构成重载。这个问题你考虑过没有
回复 使用道具 举报
虽然现在看的还不是很明白。以后我也肯定是大神!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马