首先我们需要了解一个概念,叫方法签名:方法的名字和参数列表称为方法签名。
public double calculateAnswer(double wingSpan, int numberOfEngines,
double length, double grossTons) {
//do the calculation here
}
比如上面的方法签名就是
calculateAnswer(double, int, double, double)
1.重写 (Override)
重写是子类对父类的允许访问的方法的实现过程进行重新编写,方法签名不能改变。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。
补充:Java语言将继承自Error类或RuntimeException的所有异常称为非受检异常。其他的称为受检异常。
重写的例子:
public class Animal {
public void makeNoise() {
System.out.println("动物可以叫");
}
public Object returntype(){
return null;
}
}
public class Dog extends Animal {
@Override
public void makeNoise() {
System.out.println("小狗汪汪叫");
}
@Override
public String returntype() {
return null;
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
Animal animal1 = new Dog();
animal.makeNoise();
animal1.makeNoise();
}
}
输出
动物可以叫
小狗汪汪叫
方法重写的规则
- 方法签名不能变
- 返回类型可以与被重写的相同,也可以是返回类型父类返回值的派生类
- 访问权限不能比父类方法中被重写的方法访问权限更低,比如父类方法是public,那么子类重写的方法也只能是public,因为不能比父类的低
- 父类的成员方法只能被他的子类重写
- final修饰的方法不能被重写
- 声明为static的方法不能被重写,但是可以被再次声明
- 重写的方法可以抛出任何非受检异常,无论被重写的方法是否抛出异常。但是重写的方法不能抛出新的受检异常,或者比被重写方法声明的更广泛的受检异常。反之则可以。
- 构造方法不能被重写
- 如果不能继承一个方法,则不能重写这个方法
重载 Overload
重载是在一个类里面,方法名字相同,参数不同,返回类型可以相同也可以不同。
每个重载的方法都需要有不同的方法签名。
//被重载的方法
public String fun1(String a, int b) {
return null;
}
//重载 返回类型不变,参数列表变
public String fun1(int b, String a) {
return null;
}
//报错,方法签名重复
public String fun1(String a, String b) {
return null;
}
//报错,方法签名重复
public String fun1(String b, String a) {
return null;
}
//报错,方法签名重复,虽然返回类型变了,但是方法签名不涉及返回类型,所以还是重复了
public Integer fun1(String a, String b) {
return null;
}
//重载
public String fun1(String a) {
return null;
}
//重载
public Integer fun1(int a) {
return null;
}
重载的规则:
- 被重载的方法一定要改变方法签名
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或更广的受检异常
- 方法能够在同一个类中或子类中被重载
- 无法以返回值类型作为重载函数的区分标准