重载(overload)
对于类的方法(包括从父类中继承的方法),方法名相同、参数列表不同的方法之间就构成了重载关系。
参数列表
参数列表又叫做参数签名,指:参数的类型、参数的个数、参数的顺序。这三者只要有一个不同就叫做参数列表不同。
重载关系只能发生在一个类中吗?
子类中的某个方法和父类中继承下来的方法,也可能构成重载的关系。
看方法之间是否是重载关系,不用管方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。
覆盖(override)也叫重写
在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆盖了之后,除非用super关键字,否则就无法再调用了。
发生覆盖的条件
- 子类和父类的方法名称、参数列表、返回类型三者必须完全相同。而且子类方法的访问修饰符的权限不能比父类低。
- 子类方法不能抛出比父类方法还多的异常。即子类方法锁抛出的异常必须和父类方法所抛出的异常一致,或者是其子类,或者什么也不抛出。
- 被覆盖的方法不能是final类型的
- 被覆盖的方法不能为private。否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
- 被覆盖的方法不能为static。所以如果父类中的方法是静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;如果父类和子类的方法都是静态的,仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
public class PartnerService {
public static int overrideFunc(){
return 110;
}
}
public class SonService extends PartnerService {
public static void main(String[] args) {
int son = overrideFunc();
System.out.println(son); //0
int par = PartnerService.overrideFunc();
System.out.println(par); //110
}
public static int overrideFunc(){
return 0;
}
}
覆盖与重载的相同点
- 都要求方法同名
- 都可以用于抽象方法与非抽象方法之间
覆盖与重载的区别
- 方法覆盖,要求参数列表完全一致,而方法重载要求参数列表必须不一致。
- 方法覆盖,要求返回类型完全一致,方法重载对此没有要求。
- 方法覆盖,只能用于子类覆盖父类的方法,方法重载用于同一类中的所有方法(包括从父类中继承而来的方法)
- 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制
- 父类的一个方法只能被子类重载一次,而一个方法可以再所有类中被重载多次。
- 对于属性(成员变量)而言,是不能重载的,只能覆盖。