重载和覆盖是Java多态性的不同表现方式。
重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型。在使用重载时,需要注意以下几点:
-
重载是通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型或不同的参数顺序。
-
不能通过方法的访问权限、返回值类型和抛出的异常类型来进行重载。
-
对于继承来说,如果基类(父类)方法的访问权限为private,那么就不能在派生类(子类)对其重载;如果派生类(子类)也定义了一个同名的函数,这只是一个新的方法,不会达到重载的效果。
覆盖(重写)是指派生类函数覆盖基类函数。覆盖一个方法并对其重写,以达到不同的作用。
- 派生类中的覆盖方法必须要和基类中被覆盖的方法有相同的函数名和参数
- 派生类中的覆盖方法发的返回值必须和基类中被覆盖方法的返回值相同
- 派生类中的覆盖方法所抛出异常必须和基类(或是其子类)中的被覆盖方法所抛出的异常一致
- 基类中被覆盖的方法不能为private,否则其子类知识定义了一个方法,并没有对其覆盖
重载和覆盖的区别主要有以下几个方面:
- 覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系;
- 覆盖只能有一个方法或只能由一对方法产生关系;重载是多个方法之间的关系;
- 覆盖要求参数列表相同;重载要求参数列表不同;
- 覆盖关系中,调用方法体是根据对象的类型(对象对应存储空间类型)来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的;
例子:
class Super{
public int f(){
return 1;
}
}
public class SubClass extends Super{
public float f(){
return 2;
}
public static void main(String[] args) {
Super s=new SubClass();
System.out.println(s.f());
}
}
上面的代码编译错误,因为函数是不能以返回值来区分,虽然父类与子类的函数有着不同的返回值,但是它们有着相同的函数名,因此,编译无法区分