重写和重载

[size=small]一、只要拥有一个继承超类方法的类,就有机会重写该方法(除非方法被标识为final或static)。重写的主要好处是具有能够定义某个子类型特定行为的能力。
以下是重写方法的规则:
1. 参数列表必须与被重写的方法的参数列表完全匹配,或者就成重载了;
2. 返回类型必须与超类中被重写方法原先声明的返回类型或其子类型相同;
3. 访问级别的限制性一定不能比被重写方法的更严格(如public->private);
4. 访问级别的限制性可以比被重写方法的弱;
5. 仅当实例方法被子类继承时,它们才能被重写。(与超类位于相同包内的子类可以重写未标识为private或final的任何超类方法;不同包中的子类只能重写那些标识为public或protected的非final方法。)
6. 重与方法可以抛出任何示检验(运行时)异常,无论被重写方法是否声明了该异常;
7. 重与方法一一不能抛出比被重写方法声明的检验异常更新或更广的检验异常。(例如,一个声明FileNotFoundException异常的方法不能被一个声明SQLException、Exception或任何其他非运行时异常的方法重写,除非它是FileNotFoundException的一个子类;
8. 重写方法能够抛出更少或更有限的异常。仅仅因为被重写方法“承担风险”,并不意味着重写子类的异常会承担同样的风险。关键之处是:不管被重写方法声明了什么异常,重写方法都不必声明它从不会抛出的任何异常;
9. 不能重写标识为final或static的方法;
10. 如果方法不能被继承,就不能被重写。

二、重载方法允许在类中复用相同的方法名称,但是具有不同的参数(并可以选择不同的返回类型)。重载一个方法往往意味着对那些调用方法的人更加友好,因为你的代码承担起处理不同参数类型的责任,而不用强制要求调用程序在调用方法之前进行了转换。
重载的规则相对简单:
1. 重载方法必须改变参数列表;
2. 重载方法可以改变返回类型;
3. 重载方法可以改变访问修饰符;
4. 重载方法可以声明新的或更广的检验异常;
5. 方法能够在同一个类或者一个子类中被重载。

三、重写和重载的区别:
1. 参数:
[list]
[*]重载方法:必须改变
[*]重写方法:一定不能改变
[/list] 2. 返回类型:
[list]
[*]重载方法:可以改变
[*]重写方法:除协变式返回外,不能改变。
[/list] 3. 异常:
[list]
[*]重载方法:可以改变
[*]重写方法:可以减小或消除。一定不能抛出新的或更广的检验异常。
[/list] 4. 访问级别:
[list]
[*]重载方法:可以改变
[*]重写方法:一定不能执行更严格的限制(可以降低限制)。
[/list] 5. 调用:
[list]
[*]重载方法:引用类型决定了选择哪个重载版本(基于声明的参数类型)。在编译时做出决定。调用的实际方法仍然是一个运行时发生的虚拟方法调用,但是编译器总是知道所调用方法的签名。因此在运行时,不仅是方法所在的类,而且参数匹配也已经明确。
[*]重写方法:对象类型(也就是堆上实际的实例类型)决定了调用哪个方法在运行时做出决定。
[/list]
[color=red]注意:对象类型(不是引用变量的类型)决定在[b]运行时[/b]使用哪个重写方法;而引用类型则决定了在[b]编译时[/b]使用哪个重载方法。[/color][/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值