目录
1.什么是方法重写
2.方法重写的规则
3.重写与重载的区别
1.什么是方法重写
重写(override,也称为覆盖):在子类中对父类中允许访问的方法的实现过程进行重新编写,子类中方法的名称、返回值类型、参数列表与父类相同,只有方法体中的实现不同
2.方法重写的规则
1.子类在重写时,方法名、返回值类型、参数列表要与父类方法一致
例如:定义一个Animal类
public class Animal {
public void sleep(){
System.out.println("动物要睡觉");
}
}
再定义一个Cat类继承Animal类,并重写其中的sleep方法
public class Cat extends Animal{
@Override
public void sleep() {
System.out.println("猫要睡觉");
}
}
注:在重写父类中的方法时,可以使用 @Override 注解来显示指示。在重写父类方法时,在方法前面加上 @Override 系统可以帮助我们检查方法的正确性。
当出现将方法名拼写错误或是返回值类型与父类不同等问题时,就会编译报错,提示无法构成重写
2.子类重写方法的访问限定符不能小于父类的访问限定符
class Animal {
protected void sleep(){
System.out.println("动物要睡觉");
}
}
class Cat extends Animal{
@Override
public void sleep() {
System.out.println("猫要睡觉");
}
}
当子类中重写方法的访问限定符小于父类时,就会报错
访问权限:private < default < protected < public
3.父类中被static、private、final修饰的方法以及构造方法都不能被重写
static:静态方法是通过类来调用的,而不是通过对象来调用的。若父类中有被static修饰的方法,且子类中也有一个方法名、返回值类型、参数列表与该方法都相同的静态方法,此时,父类与子类中的静态方法是两个没有关系的方法。当通过一个指向子类对象的父类引用变量来调用该静态方法时,只会调用父类的静态方法,因此static修饰的方法没办法达到重写的目的。
private:
class Animal {
public void show(){
sleep();
}
private void sleep(){
System.out.println("动物要睡觉");
}
}
class Cat extends Animal{
//被private修饰的父类方法不能被重写,若加上@Override则会报错
//@Override
public void sleep() {
System.out.println("猫要睡觉");
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat();
cat.show();
}
}
运行结果
此时通过show方法调用的sleep方法为父类Animal中的方法,表明private修饰的sleep方法与子类中的sleep方法不构成重写,即父类与子类中的sleep方法是两个没有关系的方法,即private修饰的方法不能到达重写的目的。
final:当方法被final修饰时,该方法则为最终方法(即不能被重写)
构造方法:类的构造方法名必须与类名一致,假如父类的构造方法能够被子类重写,那么子类类名必须与父类类名相同,因此构造方法不能被重写
5.被重写的方法的返回值类型可以不同,但是必须具有父子类关系
class Animal {
public void sleep(){
System.out.println("动物要睡觉");
}
}
class Cat extends Animal{
@Override
public void sleep() {
System.out.println("猫要睡觉");
}
}
class A{
public Animal fun(){
Animal an = new Animal();
return an;
}
}
class B extends A{
@Override
public Cat fun() {
Cat c = new Cat();
return c;
}
}
父类A与子类B中的返回值类型虽然不同,但Animal与Cat是父子类关系,因此可以重写
3.重写与重载的区别
方法重写是子类与父类的一种多态性表现,而方法重载是一个类的多态性表现
区别 | 重写(override) | 重载(overload) |
参数列表 | 必须相同 | 必须不同 |
返回类型 | 必须相同(或构成父子类关系) | 可以不同 |
访问限定符 | 子类不能低于父类(且父类方法不能被private修饰) | 可以修改 |