📜  Java-覆盖(1)

📅  最后修改于: 2023-12-03 14:42:20.496000             🧑  作者: Mango

Java-覆盖

在面向对象编程中,覆盖是指在子类中实现与父类同名同参数的方法,覆盖是Java继承特性的一种体现。通过覆盖我们可以重新定义继承的方法,使其适应自己的需求,从而在继承的基础上扩展或更改方法的行为。

覆盖的基本规则
  • 覆盖的方法必须与被覆盖的方法具有相同的参数列表。
  • 覆盖的方法不能比被覆盖的方法更严格。
  • 覆盖的方法不能比被覆盖的方法抛出更多的异常。
  • 覆盖的方法可以返回相同的或子类的类型。
示例
class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void eat() { // 覆盖Animal的eat方法
        System.out.println("Dog is eating");
    }
}

class Main {
    public static void main(String[] args) {
        Animal a = new Animal();
        a.eat(); // Animal is eating
        
        Dog d = new Dog();
        d.eat(); // Dog is eating
    }
}

在上面的示例中,我们定义了一个Animal类和一个Dog类,Dog类继承了Animal类。我们覆盖了Animal类中的eat方法,并在Dog类中重新实现了这个方法。当我们调用a.eat()时,输出Animal is eating。当我们调用d.eat()时,输出Dog is eating。这说明我们成功覆盖了Animal的eat方法。

super关键字

Java中的super关键字用于访问父类的成员变量或方法。当我们在子类中覆盖父类的方法时,可以使用super关键字调用父类的方法。

class Animal {
    void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    void eat() { // 覆盖Animal的eat方法
        super.eat(); // 调用父类的eat方法
        System.out.println("Dog is eating");
    }
}

class Main {
    public static void main(String[] args) {
        Dog d = new Dog();
        d.eat(); // Animal is eating
                 // Dog is eating
    }
}

在上面的示例中,我们在Dog类中覆盖了Animal类的eat方法。使用了super.eat()来调用父类Animal的eat方法,确保在Dog的eat方法中也输出Animal is eating。

总结

覆盖是Java继承的一种体现,通过覆盖我们可以重新定义继承的方法,使其适应自己的需求,从而在继承的基础上扩展或更改方法的行为。必须遵守覆盖的基本规则,同时也可以使用super关键字调用父类的方法。