Java方法的重载与重写规则

1、Java中重载方法第一个重要的规则是改变方法的签名。方法签名由参数个数、参数类型和参数顺序组成。

  1. public class DemoClass{
  2. //overloaded method
  3. public Integer sum(Integer a, Integer b){
  4. return a + b;
  5. }
  6. //overloading method
  7. public Integer sum(Float a, Integer b){
  8. return null;
  9. }
  10. }

2、返回值类型不是方法签名的一部分,因此,仅改变方法的返回值类型不能实现方法重载。

  1. public class DemoClass {
  2. // Overloaded method
  3. public Integer sum(Integer a, Integer b) {
  4. return a + b;
  5. }
  6.  
  7. // Overloading method
  8. public Float sum(Integer a, Integer b) { //Not valid; Compile time error
  9. return null;
  10. }
  11. }

3、抛出不同类型的异常也不可以实现重载。

  1. public class DemoClass {
  2. // Overloaded method
  3. public Integer sum(Integer a, Integer b) throws NullPointerException{
  4. return a + b;
  5. }
  6.  
  7. // Overloading method
  8. public Integer sum(Integer a, Integer b) throws Exception{ //Not valid; Compile time error
  9. return null;
  10. }
  11. }

二、方法重写规则

上面我们介绍的方法重载的规则。下面来介绍一下方法重写的相关规则。 
1、重写的方法和被重写的方法必须拥有相同的签名,如果不相同则是方法重载。 
2、重写方法的返回类型可以是被重写方法返回类型的子类。

  1. public class SuperClass {
  2. //Overriden method
  3. public Number sum(Integer a, Integer b) {
  4. return a + b;
  5. }
  6. }
  7.  
  8. class SubClass extends SuperClass {
  9. //Overriding method
  10. @Override
  11. public Integer sum(Integer a, Integer b) { //Integer extends Number; so it's valid
  12. return a + b;
  13. }
  14. }

3、private、static和final方法不可以被重写。 
4、重写方法不能抛出比被重写方法更高层次的被检查异常。如:父类中被重写方法抛出FileNotFoundException异常,子类中的重写方法可以抛出FileNotFoundException异常,但不允许执行IOExceptionException异常。因为,IOExceptionExceptionFileNotFoundException的超类。

  1. public class SuperClass {
  2. //Overriden method
  3. public Integer sum(Integer a, Integer b) throws FileNotFoundException {
  4. return a + b;
  5. }
  6. }
  7.  
  8. class SubClass extends SuperClass {
  9. //Overriding method
  10. public Integer sum(Integer a, Integer b) throws IOException { //Not valid; Compile time error
  11. return a + b;
  12. }
  13. //Exception IOException is not compatible with throws clause in SuperClass.sum(Integer, Integer)
  14. public Integer sum(Integer a, Integer b) { //It's valid; Don't declare the exception at all is permitted.
  15. return a + b;
  16. }
  17. }

5、最后需要注意的是,重写方法不能降低被重写方法的访问范围。简单地讲,如是父类中被重写的方法是protected,那么子类中重写方法的词就不可以private。但它可以是protedted(same access)或public(wider access)。

    1. public class SuperClass {
    2. //Overriden method
    3. protected Integer sum(Integer a, Integer b) {
    4. return a + b;
    5. }
    6. }
    7.  
    8. class SubClass extends SuperClass {
    9. //Overriding method
    10. //Not valid; Compile time error "Cannot reduce the visibility of the inherited method from SuperClass"
    11. private Integer sum(Integer a, Integer b) {
    12. return a + b;
    13. }
    14. }
posted @ 2019-07-23 11:10  天涯海角路  阅读(714)  评论(0)    收藏  举报