更新时间:2023年02月17日14时59分 来源:传智教育 浏览次数:
重载(overload)和覆盖(override)是Java多态性的两种同表现方式。细节在于,重载是说在一个类里面定义了多个同名的方法,这些方法的参数类型与个数的不尽相同。重载可以理解成是多态性的一种表现。我们在使用重载的时候,还应该注意以下几个点:
1)重载是通过不同的方法参数来区分的,比方说不同的参数类型、不同的参数个数以及不同的参数顺序。
2)不可以通过方法的返回值类型、抛出的异常类型以及访问权限来进行重载。
3)拿继承举例,如果基类的方法的访问权限为private,那么就不能在派生类对其重载;如果派生类也定义了一个同名的函数,这相当于一个新的方法,并不能达到重载的效果。
覆盖指的是派生类函数覆盖基类函数。覆盖一个方法并对其重写,来达到不同的作用。在使用覆盖时一般需要注意以下几点:
1)派生类中的覆盖方法的返回值必须和基类中被覆盖白方法的返回值相同。
2)派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数。
3)派生类中的覆盖方法所抛出的异常必须和基类(或是其子类)中被覆盖的方法所抛出的异常一致。
4)基类中被覆盖的方法不能为private,否则其子类只是定义了一个方法,并没有对齐覆盖。
重载与覆盖主要的区别是什么?
1)重载属于水平关系,也即同一个类中方法之间的关系;覆盖属于垂直关系,是父类和子类之间的关系。
2)重载是多个方法之间的关系;覆盖只能由一对方法或者只由一个方法产生关系。
3)重载要求参数列表可以是不同的;覆盖要求参数列表必须相同。
4)重载关系是根据调用时的实参表与形参表来选择方法体的;而覆盖关系中,调用方法体时根据对象的类型(对象对应存储空间类型)来决定的。
常见笔试题:
如下代码的运行结果是什么?
class Super { public int f() { return 1; } } public class SubClass extends Super { public float f() { return 2f; } public static void main(String[] args) { Super s = new SubClass; System.out.println(s.f()); } }
答案:编译错误。因为函数是不能以返回值来区分的,虽然父类与子类中的函数有着不同返回值,但是它们有着相同的函数名,因此,编译器无法区分。