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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈云阳 高级黑马   /  2014-4-19 05:46  /  1602 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

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

2. double show(int x,char y,double z){}

为什么a与1是可以重载存在同一个类中
a与2却不能存在同一个类中

为什么这俩个会有种族歧视  求解




12 个回复

倒序浏览
我给你说一下方法重载需要注意的事项,你就知道为什么了。顺便再给你提下方法覆盖。
方法重载(overload)
        就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数
        注意事项:
                1、方法名相同
                2、方法的参数类型、个数、顺序至少有一项不同
                3、方法的返回类型可以不同
                4、方法的访问修饰符可以不同
                5、如果仅仅是返回类型或者修饰符或者两者都不相同,不能构成方法重载
方法覆盖(override)
        1、子类的方法的返回类型、参数、方法名称要与父类的返回类型、参数、方法名称完全一样,否则编译出错
        2、子类的方法不能缩小父类方法的访问权限
        3、重写的方法不能比被重写的方法抛出更宽泛的异常(子类的方法不能扩大父类方法的异常)
        4、发生在具有继承关系的两个类之间
        5、私有的方法不能被覆盖
        6、构造方法不能被覆盖,因为构造方法不能被继承
        7、静态的方法不存在覆盖,因为静态方法的执行根本不需要对象
        8、覆盖指的是成员方法,和成员变量无关

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
函数重载只跟参数列表有关,参数类型包括参数类型和参数个数,跟返回值类型无关
就拿本例来说,a与1的第二个参数,第三个参数都不一样(顺序不一样,参数列表也是不一样的),
而a跟2实质上,仅仅是参数的名称不一样而已,
举例来说,土豆可以叫土豆,也可以叫地蛋,本质上是一样的

再强调一次,参数类型个数才是看重载的关键点。


点评

才想起第二个的参数 是一样,是看错了,  发表于 2014-4-19 14:11

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
1.重载和返回值的类型没有关系的,,只和参数个数与参数类型样有关故:a与1是重载,因为他们的参数顺序不同所以可以重载,而a与2他们的参数类型的顺序不同,不能称为重载。
2.覆盖就是返回类型、参数、方法名称要与父类的返回类型、参数、方法名称完全一样才可以覆盖,a也2虽然参数是一样的,但是返回值类型又不同,故也不能成为覆盖,所以才不能出现字啊同一个类中,
回复 使用道具 举报
java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析
1 普通方法的重载
普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利
当方法同名时,为了让编译器区别他们,至少需要下面之一不同
1 参数个数不同
2 对应位置上的参数类型不同
不允许参数完全相同而只是返回值不同的情况出现。无法进行编译,程序在eclips中显示错误
2 构造方法的重载
见文章构造方法的继承
重载的解析
当类的设计者提供了重载方法之后,类的使用者在使用这些方法时编译器需要确定调用哪一个方法,确定的唯一依据是参数列表,确定的过程被称为重载的解析。

编译器解析的步骤按照下面的顺序进行
1 根据调用的方法名,查找是否有定义好的同名方法,如果没有就会报错
2 比较形参和实参的数目是否相等,如果没有则会报错。如果有一个或多个方法符合条件,这些方法进入候选集
3 与候选集中的方法比较参数表,如果对应位置上的每个参数类型完全匹配,或者可以通过扩展转换相匹配,则该方法称为可行方法,并入可行集。若不存在可行方法,则会报错
4 在可行集中按照下面的原则选取最佳可行方法,若最佳可行方法为0 则会报错,否则最佳可行方法就是最终确定要调用的方法
获取的原则是
1 若每一个参数都可以完全匹配,它就是最佳可行方法
2若某个方法的每一个参数都不比别的方法差,且至少有一个参数比别的方法好,它就是最佳可行方法,这里的差和好是指,完全匹配要比扩展转化好,不过同样是扩展转换,仍然存在好喝差的问题,扩展转换有两条路径
byte-short-int-long-float-double
char-int-long-float-double
这两条路径中位于左边的类型都可以转换为右边的类型,不过源类型与目标类型的距离越近,则这种转化就越好。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
重载: 如果同一个类中包含了两个或两个以上方法,他们的方法相同方法参数个数参数类型不同,则称该方法被重载,这个过程称为方法重载,成员方法和构造方法都可以进行重载.
回复 使用道具 举报
左拉 中级黑马 2014-4-19 09:28:15
7#
为什么a与1是可以重载存在同一个类中:
因为这两个方法参数不一样,一个有返回值,一个没有返回值,所以两个方法基本上没有相同点,是合格的重载。
a与2却不能存在同一个类中:
两个方法参数相同,一个有返回值,另一个没有返回值,如果你执行show(1,'a',0.0)这个方法,JVM该让它有返回值还是该让它米有返回值呢。这是方法定义重复,混乱。
回复 使用道具 举报
  1. a.  void show(int a,char b,double c){}

  2. 1.  int show(int a,double c,char b){}

  3. 2. double show(int x,char y,double z){}

  4. //首先,重载是和返回值类型无关的,重载只看参数列表,
  5. //而看参数列表,就是看列表的参数个数是否相同,参数列表的顺序是否相同,

  6. //a和1 ,参数列表参数顺序明显不同啊
  7. //a和2 , 参数个数 和参数顺序都是相同的,只不过是给参数换了一个名字而已
  8. //                这明显就是换汤不换药嘛,你说形式参数你换一个名字有什么用。
复制代码

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
知识点:函数重载只和参数列表有关,跟返回值类型无关。
参数列表包括参数个数和参数类型,参数的排列顺序不同,参数列表也不同。
a和1因为参数的排序不同,所以参数列表是不同的,是重载,可以存在于同一个类中。
a和2参数列表是一样的(只不过变量名不同,a是abc,2是xyz,其实是一样的),返回值类型不同。如果存在于同一个类中,调用show函数的时候,虚拟机不知道该调用哪一个函数。

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

回复 使用道具 举报
我跟他们意见一样 呵呵
函数重载只和参数列表有关,跟返回值类型无关。
不过补充一条,方法名必须相同  才能是重载吧。
回复 使用道具 举报
函数的重载就要按照下面5步来分辨出来就行了:
1、针对同一个类中的一个函数来说的,必须两个函数是在同一个类中;
2、这组函数中,函数名称相同(一般情况下建议功能相似的函数才做函数重载);
3、形式参数不相同,包括参数的个数不同、参数的类型不同或参数个数和类型都不相同(a和1中看似一样,其实参数的类型发生了变化);
4、与函数的返回值类型没有关系;
5、在调用函数时会根据参数的类型和个数自动去匹配,决定调用哪个函数。这种匹配是不精确的,会找最精确的,如果没有最精确的,会找次精确的,以此类推,而且这种匹配不需要人为去调用。
回复 使用道具 举报
函数重载是指同样的方法在不同的地方具有不同的含义、
函数重载使一个类中可以有多个相同名字的方法,在编译阶段,具体调用哪个被重载的方法,编译器会根据
参数的不同来静态调用相应的方法。
注意:函数重载是指多个函数可以享有相同的名字,但是
这些函数的参数必须不同,或是参数的数量不同,或是参数的类型不同。与返回类型无关

Java编译器会根据参数的个数和类型来决定所使用的函数。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马