什么是重写
在子类中创建了一个与父类中名称相同、返回值类型相同、参数列表的方法相同,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖、方法复写。
为什么需要重写
原有的方法无法满足新的需求,需要对这个方法进行改良来满足新的需求。
重写是出现在子类继承父类方法中,可以看出,重写就是子类继承的父类方法无法满足子类的新的功能需求,子类对父类的这个方法进行改良重写的一种方式。
子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。
Java重写规则
- 方法名必须相同
- 返回的类型必须与被重写的方法的返回类型相同
- 参数列表必须相同;
- 修饰符:范围可以扩大但不能缩小:public>Protected>Default;
- 抛出的异常:范围可以缩小但不能扩大 ClassNotFoundException–>Exception(大);
- 子类的方法和父类必要一致;
Java重写举例
每种动物都有名字和年龄属性,但是喜欢吃的食物是不同的,比如狗喜欢吃骨头、猫喜欢吃鱼等,因此每种动物的介绍方式是不一样的。
class Animal{ public void move(){ System.out.println("动物可以移动"); } } class Dog extends Animal{ public void move(){ System.out.println("狗可以跑和走"); } } public class TestDog{ public static void main(String args[]){ Animal a = new Animal(); // Animal 对象 Animal b = new Dog(); // Dog 对象 a.move();// 执行 Animal 类的方法 b.move();//执行 Dog 类的方法 } }
在上面的例子中可以看到,尽管 b 属于 Animal 类型,但是它运行的是 Dog 类的 move方法。
这是由于在编译阶段,只是检查参数的引用类型。
然而在运行时,Java 虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为 Animal 类中存在 move 方法,然而运行时,运行的是特定对象的方法。
super关键字的使用
当需要在子类中调用父类的被重写方法时,要使用 super 关键字。
public class Animal { public void shout(){ System.out.println("动物都会叫"); } }
子类调用父类的shout()方法:
public class Dog extends Animal{ @Override public void shout() { super.shout(); System.out.println("汪汪汪"); } }
public class AnimalTest { public static void main(String[] args) { Animal b = new Dog(); b.shout(); } }
运行结果
动物都会叫 汪汪汪
Java重写的注意事项
- 重写的方法可以使用 @Override 注解来标识。
- 构造方法不能被重写。
- 声明为 final 的方法不能被重写。
- 子类和父类在同一个包中时,子类可以重写父类除了声明为 private 和 final 方法的其他方法。
- 子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。
- 如果不能继承一个方法,则不能重写这个方法。重写是在继承的基础上,如果方法无法被继承那么就无法重写
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》