【翻译】Java方法的重载与重写规则

【翻译】Java方法的重载与重写规则

        原文地址:Java Method Overloading and Overring Rules

一、方法重载规则

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

public class DemoClass{
    //overloaded method
    public Integer sum(Integer a, Integer b){
        return a + b;
    }
    //overloading  method
    public Integer sum(Float a, Integer b){
        return null;
    }
}

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

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) {
        return a + b;
    }

    // Overloading method
    public Float sum(Integer a, Integer b) {     //Not valid; Compile time error
        return null;
    }
}

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

public class DemoClass {
    // Overloaded method
    public Integer sum(Integer a, Integer b) throws NullPointerException{
        return a + b;
    }

    // Overloading method
    public Integer sum(Integer a, Integer b) throws Exception{  //Not valid; Compile time error
        return null;
    }
}

二、方法重写规则

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

public class SuperClass {
    //Overriden method
    public Number sum(Integer a, Integer b) {
        return a + b;
    }
}

class SubClass extends SuperClass {
    //Overriding method
    @Override
    public Integer sum(Integer a, Integer b) {      //Integer extends Number; so it's valid
        return a + b;
    }
}

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

public class SuperClass {
    //Overriden method
    public Integer sum(Integer a, Integer b) throws FileNotFoundException {
        return a + b;
    }
}

class SubClass extends SuperClass {
    //Overriding method
    public Integer sum(Integer a, Integer b) throws IOException {       //Not valid; Compile time error
        return a + b;
    }
    //Exception IOException is not compatible with throws clause in SuperClass.sum(Integer, Integer)
    public Integer sum(Integer a, Integer b)  {                     //It's valid; Don't declare the exception at all is permitted.
        return a + b;
    }
}

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

public class SuperClass {
    //Overriden method
    protected Integer sum(Integer a, Integer b) {
        return a + b;
    }
}

class SubClass extends SuperClass {
    //Overriding method
    //Not valid; Compile time error "Cannot reduce the visibility of the inherited method from SuperClass"
    private Integer sum(Integer a, Integer b)  {    
        return a + b;
    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值