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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 暴风城管 中级黑马   /  2016-3-9 19:16  /  849 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

看了视频之后一直不明白,虽然生活中可能没有这种情形,但是还是想问一下,如果定义函数并重载,函数形参个数相同,但是类型不同,比如一个是int,一个是byte,那么调用的时候会怎么样啊?
//下面是两个函数定义例子
public static int fun(int a)
public static int fun(byte a)

11 个回复

倒序浏览
有时调用一个方法时,会有两个或更多可能的匹配,这时,java编译器会寻找最精确匹配的方法。比如调用max(1,2)时,有两个函数max(double,double)和max(int,int),这两个都是可能的匹配。调用方法时,java编译器寻找最精确匹配方法。因为方法max(int,int)比max(double,double)更精确,所以调用max(1,2)时使用的是max(int,int)。
对于楼主的问题,要看调用时给形参的具体值和那个方法更精确匹配。如果匹配精确度相同,编译器就无法判断哪个是最精确的匹配。这称为歧义调用。歧义调用会产生一个编译错误。比如max(int,double)和max(double,int)都有可能与max(1,2)匹配。由于两个方法谁也不比谁更精确,所以这个调用是有歧义的,它会导致一个编译错误。
回复 使用道具 举报
对于有两个方法max(byte,byte)和max(int,int),调用max(1,2)时,是不是会出现歧义调用,我也不清楚,希望用同学解答一下。
回复 使用道具 举报
xiaofushen 发表于 2016-3-9 19:57
对于有两个方法max(byte,byte)和max(int,int),调用max(1,2)时,是不是会出现歧义调用,我也不清楚,希望 ...

好的,谢谢了,继续等待
回复 使用道具 举报
方法的重载是方法名一样,与返回值类型无关,只看参数列表.
所以上面2个方法一个参数列表是fun(int a),另一个参数列表是fun(byte a),即一个是int型一个是byte型
当调用fun方法前,你需要先声明一个变量,比如声明变量b(其实也可以直接声明变量a)即int b=1,b就是int型,此时fun(b),就会自动找到它public static int fun(int a),不会找到另一个,因为另一个接收byte,b不是byte.
回复 使用道具 举报
wlsperfect 发表于 2016-3-9 22:14
方法的重载是方法名一样,与返回值类型无关,只看参数列表.
所以上面2个方法一个参数列表是fun(int a),另一个 ...

是这样的啊,原来如此  我明白了  谢谢你啊
回复 使用道具 举报
xiaofushen 发表于 2016-3-9 19:57
对于有两个方法max(byte,byte)和max(int,int),调用max(1,2)时,是不是会出现歧义调用,我也不清楚,希望 ...

不会的,因为整型数值,默认就是int型的,只会调用Int int 方法
回复 使用道具 举报 1 0
首先你得搞明白函数重载是干什么用的>  函数重载是为了,调用函数的时候,函数名相同,为了调用方便,传入不同类型的数据都会有输出;
原则上是,重载函数之间的方法操作是一样的,不然重载函数也就没有意义了
回复 使用道具 举报
还真没试过
回复 使用道具 举报
本帖最后由 sl943508135 于 2016-3-11 00:08 编辑

楼上的我试了,没出现歧义,结果都是0,都是调用的int类型的,因为整数默认就是int类型吧代码如下:
public class TestMethod {
        public static void main(String[] args){
                 System.out.println(max(1,2));
                 System.out.println(max(200,300));
         }
        public static int max(byte b1,byte b2){
                return b1 > b2 ? 0 : 1;
        }
        public static int max(int t1,int t2){
                return t1 > t2 ? 1 : 0;                    
        }
}



回复 使用道具 举报
MZ不再沉默 发表于 2016-3-10 22:09
不会的,因为整型数值,默认就是int型的,只会调用Int int 方法

对的,我试了一下,的确是这样
回复 使用道具 举报
我知道了,谢谢楼上,还是函数匹配精确度的问题,上面的问题:对于有两个方法max(byte,byte)和max(int,int),调用max((byte)1,(byte)2)时,就会调用max(byte,byte).
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马