原文地址: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
异常,但不允许执行IOException
或Exception
异常。因为,IOException
和Exception
是FileNotFoundException
的超类。
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;
}
}