java允许在一个类中,多个方法拥有相同的名字,但在名字相同的同时,必须有不同的参数,这就是重载,编译器会根据实际情况挑选出正确的方法,如果编译器找不到匹配的参数或者找出多个可能的匹配就会产生编译时错误,这个过程被称为重载的解析。
1、普通方法的重载
普通方法的重载是Java实现多态技术的重要手段,为编程带来了很多便利。当方法同名时,为了让编译器区别他们,至少需要下面之一不同 :
(1)参数个数不同
(2)对应位置上的参数类型不同
不允许参数完全相同而只是返回值不同的情况出现。无法进行编译,程序在eclips中显示错误
2、
(I)构造方法重载
(1)在Java中,允许在一个类中定义多个构造方法。
(2)在创建对象时,系统会自动根据所调用的构造方法中包含的参数类型,个数,选择匹配的构造方法创建对象。
(II)构造方法的注意事项
(1)如果在类中没有明确定义构造方法,系统会自动调用默认的构造方法。
(2)如果指定了构造方法,则不调用默认的构造方法。
(3)如果已经指定了有参的构造方法,而又要调用无参的构造方法,则要在类中追加无参构造方法的定义。
3、编译器解析的步骤按照下面的顺序进行
(1)根据调用的方法名,查找是否有定义好的同名方法,如果没有就会报错
(2)比较形参和实参的数目是否相等,如果没有则会报错。如果有一个或多个方法符合条件,这些方法进入候选集
(3)与候选集中的方法比较参数表,如果对应位置上的每个参数类型完全匹配,或者可以通过扩展转换相匹配,则该方法称为可行方法,并入可行集。若不存在可行方法,则会报错
(4)在可行集中按照下面的原则选取最佳可行方法,若最佳可行方法为0 则会报错,否则最佳可行方法就是最终确定要调用的方法
获取的原则是
(1)若每一个参数都可以完全匹配,它就是最佳可行方法
(2)若某个方法的每一个参数都不比别的方法差,且至少有一个参数比别的方法好,它就是最佳可行方法,这里的差和好是指,完全匹配要比扩展转化好,不过同样是扩展转换,仍然存在好喝差的问题,扩展转换有两条路径
byte-short-int-long-float-double
char-int-long-float-double
这两条路径中位于左边的类型都可以转换为右边的类型,不过源类型与目标类型的距离越近,则这种转化就越好。
示例 :
show(int a ,int b,int c) //1
show(int a ,int b,double c) //2
show(int a ,double b,double c) //3
show(double a,double b,int c) //4
下面是调用
show(1,2,3); //1,2,3,4都是可行方法所有参数完全匹配1
show(1.0,2.0,3.0); //没有一个可行方法
show(1.0,2,3); //4是最佳可行方法
show(1,2.0,3); //3,4都是可行方法,没有最佳可行方法,报错