重载和覆盖

方法的重载:

    方法名必须相同;参数个数或类型不同;对返回值不做要求,访问权限修饰符及final修饰符对重载也没有影响。静态方法和实例方法之间可以重载。


方法的覆盖(重写):

    方法名必须相同;返回值数据类型必须完全相同;方法的参数必须完全相同,包括参数的个数、类型和顺序。

    此外,子类方法的访问权限不能严于父类的方法;父类静态方法不能被子类实例方法覆盖,父类实例方法也不允许被子类静态方法覆盖;父类final方法    不允许被覆盖,但是父类非最终方法可以在子类中使用final修饰符。


重载和覆盖的区别:

    a.重载和覆盖的方法名称都相同,但重载要求参数列表不同,覆盖要求参数列表完全相同

    b.重载对方法前面的修饰符没有限制,而覆盖则对这些修饰符的使用有限制

    c.同一类中的方法能互相重载,但不能互相覆盖,子类对父类的方法可以重载也可以覆盖

    d.重载是编译器在编译期间就能确定调用哪个方法,而覆盖则可能在运行期间才确定


重载的解析:

重载情况下,编译器需要确定调用哪一个方法。确定的唯一依据是参数列表,确定的过程称为重载的解析。

编译器的解析步骤如下:

1.根据调用的方法名,查找是否有定义好的方法,没有则报错。

2.比较形参和实参的数目是否相等,不等则报错。如果有一个或多个符合,则这些方法进入候选集。

3.与候选集中的方法比较参数,如果对应位置上的参数类型完全匹配,或扩展转换想匹配,则该方法可行,进入可行集。若不存在可行方法则报错。

4.可行集按照下面原则选取最佳可行方法,如果可行方法没有,则报错。

   选取原则:

   a.每个参数完全匹配,则它就是最佳可行方法。

   b.若某方法的每一个参数匹配都不比别的方法差,切至少有一个参数比别的方法好,它就是最佳可行方法。

      “差”和“好”指:完全匹配要比扩展转换“好”,扩展转换要比完全匹配“差”。此外,扩展转换之间要也存在“好”和“差”的问题。

      扩展转换的路径有 byte—>short—>int—>long—>float—>double  和 char—>int—>long—>float—>double

      以上路径中,左边的类型都可以转换成右边的,源类型和目标类型的距离越近,则这种转换就越好。比如int转换成float要比转换成double要好。

     和两个不同类型的基本数据类型进行运算时需要自动转型的原则一样~~


确定最佳可行方法示例:

若有下列重载方法

a. show(int a, int b, int c);  

b. show(int a, int b, double c);

c. show(int a, double b, double c);

d. show(double a, double b, int c);

下面调用:

show(1, 2, 3);  // a b c d 都是可行方法,所有参数完全匹配a,它是最佳可行方法。

show(1.0, 2.0, 3.0);  // 没有一个方法可行,错误

show(1.0, 2, 3);  // 第二个参数通过扩展转换匹配d, d是最佳可行方法

show(1, 2.0, 3);  // c和d都是可行方法,没有最佳可行方法,错误

show(1, 2, 3.0f); // b c都是可行方法,b的第二个参数比c的第二个参数要好,多亿b是最佳可行方法





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值