MST
星途 面试题库

面试题:Java中抽象类与具体类在方法重写方面的区别

在Java中,详细阐述抽象类中的抽象方法与具体类中的普通方法在被重写时的规则及区别,并且举例说明。
15.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

抽象类中的抽象方法重写规则

  1. 必须重写:当一个非抽象子类继承自包含抽象方法的抽象类时,子类必须重写这些抽象方法。否则,子类也必须声明为抽象类。
  2. 方法签名必须一致:重写方法的方法名、参数列表和返回类型(在Java 5.0及之后,返回类型可以是协变的,即重写方法的返回类型可以是被重写方法返回类型的子类)必须与抽象方法一致。
  3. 访问修饰符:重写方法的访问修饰符不能比抽象方法的访问修饰符更严格。例如,如果抽象方法是 protected,重写方法可以是 protectedpublic,但不能是 private

具体类中的普通方法重写规则

  1. 可选择性重写:子类可以选择重写父类的普通方法,以提供更符合自身需求的实现。
  2. 方法签名必须一致:同样,重写方法的方法名、参数列表和返回类型(协变规则同样适用)必须与父类的普通方法一致。
  3. 访问修饰符:访问修饰符不能比父类普通方法的访问修饰符更严格。同时,如果父类方法是 final,则不能被重写。

区别

  1. 强制重写性:抽象类中的抽象方法强制子类重写(除非子类也是抽象类),而具体类中的普通方法子类可选择是否重写。
  2. 存在形式:抽象方法只有声明,没有实现(方法体为空);普通方法既有声明也有实现。

举例说明

// 抽象类
abstract class Animal {
    // 抽象方法
    public abstract void makeSound();

    // 普通方法
    public void sleep() {
        System.out.println("Animal is sleeping");
    }
}

// 具体子类
class Dog extends Animal {
    // 重写抽象方法
    @Override
    public void makeSound() {
        System.out.println("Dog barks");
    }

    // 重写普通方法
    @Override
    public void sleep() {
        System.out.println("Dog is sleeping");
    }
}

在上述例子中,Dog 类继承自 Animal 抽象类,必须重写 makeSound 抽象方法。同时,Dog 类也选择重写了 sleep 普通方法,以提供符合 Dog 特性的实现。