文章目录

  • 相关知识


相关知识

在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的内容不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖**。重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。

子类可以根据需要,定义自己特定的方法。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

在重写方法时,需要遵循下面的规则:

参数列表必须完全与被重写的方法参数列表相同;

(1)返回的类型必须与被重写的方法的返回类型相同(Java1.5 版本之前返回值类型必须一样,之后的 Java版本放宽了限制,返回值类型必须小于或者等于父类方法的返回值类型);

(2)访问权限不能比父类中被重写方法的访问权限更低(public>protected>default>private);

(3)重写方法一定不能抛出新的检査异常或者比被重写方法声明更加宽泛的检査型异常。例如,父类的一个方法声明了检査异常IOException,在重写这个方法时就不能抛出 Exception,只能拋出 IOException 的子类异常,可以抛出非检査异常。

另外还要注意以下几条:

(1)重写的方法可以使用 @Override 注解来标识;

(2)父类的成员方法只能被它的子类重写;

(3)声明为 final 的方法不能被重写;

(4)声明为 static 的方法不能被重写,但是能够再次声明;

(5)构造方法不能被重写;

(6)子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法;

(7)子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法;

(8)如果不能继承一个方法,则不能重写这个方法。

例子:

class Animal{
    // 定义 info 方法,输出动物信息
    public void info(){
        System.out.println("我是动物");
    }
}
class Dog extends Animal{
    // 重写父类的 info 方法,改为输出自身信息
    @Override
    public void info(){
        System.out.println("我是小狗");
    }
}
public class DemoTest{
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.info();
    }
}
执行结果:

我是小狗