方法的重载Overload
在Java中,重载就是编写一个名称相同,参数个数或者类型不同的方法,关于方法重载的定义要求:
- 方法的重载要求方法的名称必须相同
- 方法的参数的类型和个数不同
- 不对方法的返回值做约束,但考虑到程序开发的标准性,会统一方法重载时的返回值类型
- 对方法的访问控制权限不做要求
public class OverLoadTestDrive {
public static void main(String[] args) {
System.out.println(add(3, 5));
System.out.println(add(3, 4, 5));
System.out.println(add(3.1D, 52.3D));
}
//方法的名称相同,参数的个数或类型不同不同
public static int add(int a,int b) {
return a+b;
}
public static int add(int a,int b,int c) {
return a+b+c;
}
public static double add(double a, double b) {
return a+b;
}
}
/*
输出:
8
12
55.4
*/
Overload多态特性在Java中的应用
- 当一个方法在调用过程中需要传入不同类型的参数时,可以使用方法的重载定义出同一方法的不同版本。
- 在类的构造方法中的应用。可以通过定义不同版本的构造函数,实现不同参数版本的构造方法,这样就可以灵活性的传参通过不同的构造方法实例化不同属性要求的类的实例。
方法的覆写Override
在Java中,方法的覆写可以继承父类中非private和非final关键字定义的所有方法。这样当父类中的某些方法无法满足子类的功能需要时,就可以通过方法的覆盖在子类中定义扩充功能的同版本的方法。关于方法覆写的定义要求:
- 子类所覆写的父类方法,必须拥有比父类更宽松的访问控制权限
class Person { public void connect() { System.out.println("18537955555"); } } class Student extends Person { @Override default void connect() { //错误,子类所覆写的方法使用了更为严格的访问控制权限 System.out.println("18555555555"); } } //访问控制权限: public < default < private
-
子类所覆写的父类的方法,必须与父类中的被覆写方法的方法名称、返回值类型、参数类型以及个数完全相同。
//一、 class Person { public int performance() { return 99; } } class Student extends Person { @Override public double performance() { //错误,子类中覆写的方法的返回值类型和父类中不同 return 88.80D; } } //二、 //父类 class Person { public int performance(int result) { return result; } } class Student extends Person { @Override public int performance(double result) { //错误,子类覆写方法的参数类型和父类不同 return result; } } //三、 class Student extends Person { @Override public int performance(int result1,int result2) { //错误,子类所覆写的方法参数个数和父类不同 return result1; } }
-
父类方法定义为private方法时,子类无法覆写该方法
class Person { private int performance(int result) { return 99; } } class Student extends Person { public int performance(int result) { //错误,实际上是在子类中重新定义了一个名为 return result //performance的方法,此时即使更换返回值类型 } //或者方法参数,程序也不会报错 }
-
当父类中的方法使用static关键字定义时,该方法不能被覆写。
-
当父类中的方法用关键字final定义时,子类中不可以覆写该方法
class Person { public final int performance(int result) { //父类方法使用了final关键字修饰 return result; } } class Student extends Person { @Override public int performance(int result) { //错误,子类不能覆写被final修饰的父类的方法 return result; } }
Override多态性在Java中的应用
- Override的Annotation注解。可以在子类中描述出哪些方法时覆写来的,增强了程序的可读性,并且在覆写方法的上方使用Annotation注解,可以检查出由于覆写方法定义错误的提示信息。
- 当父类中的方法无法满足子类的要求是,方法的覆写使得子类拥有了属于自己的扩充过的方法。
- 可以在不改变父类方法或属性的前提下,创建一个和父类有相同名称的方法,使得程序更加安全。
Overload和Override之间的区别
区别 | Overload(重载) | Override(覆写) |
---|---|---|
定义 | 方法的名称相同,参数类型和个数或者返回值类型可以不同 | 方法名称,返回值类型,参数个数以及类型必须完全形同 |
访问控制权限 | 不强制权限要求 | 被子类覆写的方法必须拥有比父类更宽松的访问控制权限 |
范围 | 发生在同一个类中 | 发生在继承关系类中 |
多态类型 | 重载是编译时决定的静态多态,是多态的动态绑定 | 覆写是普通的多态,在运行阶段决定,是面向对象编程的重要特征 |