MST

星途 面试题库

面试题:Java中抽象类重写与重载的区别

请阐述在Java中,抽象类方法的重写(Override)和重载(Overload)在概念、规则以及使用场景上有哪些区别,并举例说明。
42.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

概念区别

  • 重写(Override):是子类对父类中已存在方法的重新实现。重写发生在父子类之间,方法签名(方法名、参数列表、返回类型)必须与父类被重写方法相同(返回类型可以是父类被重写方法返回类型的子类,即协变返回类型)。
  • 重载(Overload):是在同一个类中,多个方法具有相同的方法名,但参数列表不同(参数个数、类型或顺序不同),与返回类型无关。

规则区别

  • 重写规则
    • 方法名、参数列表必须与被重写方法相同。
    • 返回类型必须与被重写方法的返回类型相同或者是其子类型(Java 5.0 引入协变返回类型)。
    • 访问权限不能比被重写方法的访问权限更严格,可以相同或者更宽松。例如,父类方法是 protected,子类重写方法不能是 private,可以是 protected 或者 public
    • 不能重写被声明为 final 的方法。
    • 不能重写被声明为 static 的方法,如果在子类中定义了与父类 static 方法具有相同签名的方法,只是定义了一个新的 static 方法,并非重写。
  • 重载规则
    • 方法名必须相同。
    • 参数列表必须不同(参数个数、类型或顺序至少有一个不同)。
    • 返回类型可以相同也可以不同,仅返回类型不同不足以构成重载。

使用场景区别

  • 重写使用场景:用于实现多态,当父类的某个方法不能满足子类的需求时,子类可以重写该方法来提供更具体的实现。例如,在图形绘制的类层次结构中,父类 Shape 有一个 draw 方法,子类 CircleRectangle 等可以重写 draw 方法来实现各自不同的绘制逻辑。
  • 重载使用场景:用于提供功能相似但参数不同的方法,方便用户根据不同的输入情况调用合适的方法。例如,System.out.println 方法就有多个重载形式,可以接受不同类型的参数进行输出。

举例说明

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

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

class MathUtils {
    // 方法重载
    public static int add(int a, int b) {
        return a + b;
    }

    public static double add(double a, double b) {
        return a + b;
    }
}

在上述代码中,Dog 类重写了 Animal 类的 makeSound 方法。MathUtils 类中的 add 方法通过不同的参数类型实现了重载。