面试题答案
一键面试概念区别
- 重写(Override):是子类对父类中已存在方法的重新实现。重写发生在父子类之间,方法签名(方法名、参数列表、返回类型)必须与父类被重写方法相同(返回类型可以是父类被重写方法返回类型的子类,即协变返回类型)。
- 重载(Overload):是在同一个类中,多个方法具有相同的方法名,但参数列表不同(参数个数、类型或顺序不同),与返回类型无关。
规则区别
- 重写规则:
- 方法名、参数列表必须与被重写方法相同。
- 返回类型必须与被重写方法的返回类型相同或者是其子类型(Java 5.0 引入协变返回类型)。
- 访问权限不能比被重写方法的访问权限更严格,可以相同或者更宽松。例如,父类方法是
protected
,子类重写方法不能是private
,可以是protected
或者public
。 - 不能重写被声明为
final
的方法。 - 不能重写被声明为
static
的方法,如果在子类中定义了与父类static
方法具有相同签名的方法,只是定义了一个新的static
方法,并非重写。
- 重载规则:
- 方法名必须相同。
- 参数列表必须不同(参数个数、类型或顺序至少有一个不同)。
- 返回类型可以相同也可以不同,仅返回类型不同不足以构成重载。
使用场景区别
- 重写使用场景:用于实现多态,当父类的某个方法不能满足子类的需求时,子类可以重写该方法来提供更具体的实现。例如,在图形绘制的类层次结构中,父类
Shape
有一个draw
方法,子类Circle
、Rectangle
等可以重写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
方法通过不同的参数类型实现了重载。