方法重载与重写
一、方法重载
在一个类中如果有多个方法有相同的名字、不同的参数(参数数量不同、类型不同、大小不同),便产生了重载(overloaded)。比如,在下面的 Person 类中,便完成了构造器的重载。
class Person {
private String name;
private int age;
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
在 Java 中,所有方法都可以重载,因此,要完整的描述一个方法,必须使用方法的签名。方法的签名就是方法名 + 参数类型,比如上面的构造器的签名就是:
Person(String)
Person(String, int)
二、方法重写
如果在子类中定义了一个与超类方法的方法签名相同的方法,那么子类中的这个方法就重写(override)了超类中的方法。重写也可以叫做覆盖。
返回类型是原返回类型或者是原返回类型的子类。
子类重写超类方法时,子类方法的可见性不可以低于超类。比如超类方法用 public 修饰,子类方法也要用 public 修饰。
超类中的方法如果用 final 修饰,那么子类是无法重写该方法的。
子类中的方法抛出的异常不能高于超类。
三、方法重载与重写的对比
重载 | 重写(覆盖) | |
---|---|---|
在同一个类 | 在同一个类 | 不在同一个类 |
方法名 | 相同 | 相同 |
方法参数列表 | 不同 | 相同 |
返回类型 | 无要求 | 原返回类型或原返回类型的子类类型 |
可见性 | 无要求 | 子类方法不低于超类方法 |
抛出异常 | 无要求 | 子类方法抛出的异常范围要小于等于超类方法 |