方法重载(Overload)
Java的方法重载,就是在类中可以创建多个方法,它们可以有相同的名字,但必须具有不同的参数,即或者是参数的个数不同,或者是参数的类型不同,又或者是参数的顺序不同。调用方法时通过传递给它们的不同的参数列表来决定具体使用哪个方法。
有时候,类的同一个功能具有多种实现方式,他们的调用可能是根据调用者提供的参数决定,但是总不可能为每一种实现都取一个易于理解的,恰当的但又彼此不相同的方法名,于是就有了方法重载。特殊的,如果一个类想用多种方式创建对象,那么它就需要多个不同的构造器,但是构造器名总是类名,所以必须用到方法重载。
重载方法必须满足的条件:
- 方法名相同。
- 方法的参数类型、个数、顺序至少有一项不相同。
- 方法的返回值类型可以不相同。
方法的修饰符可以不相同。
在一个类中,不允许定义两个方法名相同,并且参数签名也完全相同的方法。
方法覆盖(Override)
在Java中,子类了继承父类中的方法,但是其方法体却可能不同,这就需要采用方法的重写。方法重写又称方法覆盖。
覆盖方法必须满足多种约束:
子类方法的名称、参数签名和返回值类型必须与父类的一致。
子类方法不能缩小父类方法的访问权限。
子类方法不能抛出比父类方法更多的异常。子类方法抛出的异常必须和父类方法抛出的异常相同,或者是子类方法抛出的异常类是父类方法抛出的异常类的子类。
父类的非静态方法不能被子类覆盖为静态方法,否则编译不通过。
方法重载和方法覆盖的异同
相同点:
都要求方法名相同。
都可以用于抽象方法与非抽象方法之间。
不同点:
方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致。
方法覆盖要求返回类型必须一致,而方法重载对此不做限制。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类的所有方法(包括从父类中继承而来的方法)。
方法覆盖对方法的访问权限和抛出的异常有特殊要求,而方法重载没有。
父类的一个方法只能被子类覆盖一次,而一个方法在所在的类中可以被重载多次。