回顾方法重载(overload)
当在一个类当中,如果功能相似的话,建议将名字定义的一样,
这样代码美观,并且方便编程。
什么条件满足之后能够构成方法重载?
- 在同一个类当中
- 方法名相同
- 参数列表不同 (个数、顺序、类型)
方法覆盖(Override)
子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时,
子类有权利对这个方法进行重新编写,有必要进行“方法的覆盖”。
方法覆盖又叫做:方法重写(Override Overwrite)
当我们代码怎么编写的时候,在代码级别上构成了方法覆盖?
- 两个类必须要有继承关系。
- 重写之后的方法和之前的方法具有相同的返回值类型、方法名、形式参数列表
- 访问权限不能更低,可以更高(子类中进行方法覆盖的,访问权限必须高于等于父类中对应的方法;先记着)
- 重写之后的方法不能比之前的方法抛出更多的异常,可以更少(先记着)
注意事项:
- 方法覆盖只是针对于方法,和属性无关
- 私有方法无法覆盖
- 构造方法不能被继承,所以构造方法也不能被覆盖
- 方法覆盖只是针对于实例方法,“静态方法覆盖”没有意义。
示例代码:
class Animal{
public void move(){
System.out.println("动物在行走");
}
}
class Cat extends Animal{
//方法覆盖
public void move(){
System.out.println("猫在走猫步");
}
//方法重载
public void move(int a){
System.out.println("猫在走猫步");
}
}
public class OverrideTest{
public static void main(String[] args){
Cat c = new Cat();
c.move(3);
c.move();
}
}
解释:静态方法不存在方法覆盖
首先方法覆盖和多态机制密不可分,方法覆盖服务于多态机制
而多态自然和对象有关系,而静态方法的执行不需要对象
所以,一般情况下,我们会说“静态方法覆盖”没有意义,静态方法“不存在”方法覆盖
所以调用静态方法就一定要使用"类名."的方式,不要使用"引用."造成歧义
示例代码:
public class Test{
public static void main(String[] args){
//多态
Pet p = new Cat();
//静态方法和对象无关,只和类相关
//虽然静态方法可以使用"引用."的方式调用,但是实际运行时还是Pet.doSome();
p.doSome();
Pet.doSome();
Cat.doSome();
}
}
class Pet {
static public void doSome() {
System.out.println("Pet类的doSome方法执行");
}
}
class Cat extends Pet{
static public void doSome() {
System.out.println("Cat类的doSome方法执行");
}
}
解释:私有方法不能覆盖(记住就行)
示例代码:
public class OverrideTest{
//私有方法
private void doSome(){
System.out.println("OverrideTest类的私有方法执行");
}
public static void main(String[] args){
OverrideTest ot = new T();
ot.doSome();
}
}
class T extends OverrideTest{
// 尝试重写父类中的doSome()
// 子类方法访问权限不能更低,可以更高
public void doSome(){
System.out.println("T类的方法执行");
}
}
解释:关于方法覆盖中的返回值类型
子类型方法覆盖中返回值类型“变小”在语法上是允许的,
但是实际开发中使用方法覆盖都是直接复制粘贴父类型中的方法,不动不改,所有这个语法实际的使用意义不大
示例代码:
public class Test{
public static void main(String[] args){
Pet p = new Cat();
p.doSome();
}
}
class Pet {
public Pet doSome() {
System.out.println("Pet类的doSome方法执行");
return null;
}
}
class Cat extends Pet{
public Cat doSome(){
System.out.println("Cat类的doSome方法执行");
return null;
}
}