方法的重载(Overload)和重写 (Override) 都是Java实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。
重载(Overload)
方法重载:同一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同。
- 方法重载是两种多态的一种,即行为的多态性。
- 重载方法必须保证互相的参数不同,可以是个数,类型或者顺序,并需要避免在调用时出现歧义调用。
- 重载对返回类型没有特殊的要求,不规定返回值类型必须一样,但也不能根据返回类型进行区分。
- 重载方法可以有不同的权限修饰符,即可修改可见性。
- 重载方法可以抛出任意大小的异常
重写(Override)
子类通过重写可以隐藏已继承的方法,也称为方法覆盖(method overriding)
目的
- 子类通过方法的重写可以隐藏继承的方法。
- 子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
- 一旦子类重写了父类的方法,就隐藏了继承的方法,那么子类对象调用该方法一定调用的是重写方法
- 如果子类没有重写,而是继承了父类的方法,那么子类创建的对象当然可以调用方法,只不过方法产生的行为和父类的相同而已。
- 重写方法既可以操作继承的成员变量、调用继承的方法,也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。如果子类想使用被隐藏的方法或成员变量,必须使用关键字 super
语法规则
- 如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法
- 子类中可以定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型,并且这个方法的名字、参数个数、参数的类型和父类的方法完全相同
- 访问控制,传递的异常可以不同
- 子类与父类之间要有兼容的
- 子类重新定义的方法,不能比父类有更严格的访问权限
- 子类重新定义的方法,不能比父类传递更多的(非运行时)异常,否则如子类传人父类等情况时可能会出错
- 里氏规则:(语法上)任何可以使用父类的地方,都可以使用子类替换
@Override注解
在对方法进行重写时,可以使用 @Override 注解重写父类的方法。
-
当我们在子类中重写父类的方法时,如果不小心写错名字或者写错参数,编译器是不会报错的,而是认为我们在子类定义了一个新的方法。
-
使用@Override注解后,编译器就会检验@Override下面的方法名是否为方法覆盖,如果不是就报错。
-
可以提高代码的可读性