Java方法的重载与重写规则
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
-
-
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;
-
}
-
}

浙公网安备 33010602011771号