方法的重载 ( overload )和覆盖 ( override
有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我 们最常用的 System.out.println() 能够打印出任何数据类型的数据,它有多种实现方式。运行时, Java 虚拟机先判断给定参数的类型,然后决 定执行哪个 println()
重载( overload ):对于类的方法(包括从父类中继承的方法),方法名相同 ,参数列表不同 的方法之间就构成了重载关系。这里有两个问题需要注意:
(1) 什么叫参数列表?参数列表又叫参数签名,指三样东西:参数的类型 ,参数的个数 ,参数的顺序 。这三者只要有一个不同就叫做参数列表不同。
(2) 重载关系只能发生在同一个类中吗?非也。这时候你要深刻理解继承,要知道一个子类所拥有的成员除了自己显式写出来的以外,还有父类遗传下来的。 所以子类中的某个方法和父类中继承下来的方法 也可以发生重载的关系。
大家在使用的时候要紧扣定义 ,看方法之间是否是重载关系,不用管 方法的修饰符和返回类型以及抛出的异常,只看方法名和参数列表。而且要记住,构造器也可以重载。
覆盖 (override) :也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。当父类中的方法被覆 盖了后,除非用 super
发生覆盖的条件:
1 、“三同一不低 ” 子类和父类的方法名称 ,参数列表 ,返回类型 必须完全相同 ,而且子类方法的访问修饰符的权限不能比父类低 。
2 、子类方法不能抛出比父类方法更多的异常 。即子类方法所抛出的异 常必须和父类方法所抛出的异常一致 ,或者是其子类 ,或者什么 也不抛出 ;
3 、被覆盖的方法不能是 final 类型的。因为 final
4 、被覆盖的方法不能为 private 。否则在其子类中只是 新定义了一个方法,并没有对其进行覆盖。
5 、被覆盖的方法不能为 static 。所以如果父类中的方法 为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误。反之亦然。即使父类和子类中的方法都是静态的, 并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
方法的覆盖和重载具有以下相同点:
都要求方法同名
都可以用于抽象方法和非抽象方法之间
方法的覆盖和重载具有以下不同点:
方法覆盖要求参数列表(参数签名)必须一致,而方法重载要求参数列表必须不一致。
方法覆盖要求返回类型必须一致,方法重载对此没有要求。
方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方 法)
方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。
另外,对于属性(成员变量)而言,是不能重载的,只能覆盖。
标签:覆盖,子类,参数,重载,父类,方法 From: https://blog.51cto.com/u_2198048/6196314