面试题答案
一键面试抽象类中的抽象方法重写规则
- 必须重写:当一个非抽象子类继承自包含抽象方法的抽象类时,子类必须重写这些抽象方法。否则,子类也必须声明为抽象类。
- 方法签名必须一致:重写方法的方法名、参数列表和返回类型(在Java 5.0及之后,返回类型可以是协变的,即重写方法的返回类型可以是被重写方法返回类型的子类)必须与抽象方法一致。
- 访问修饰符:重写方法的访问修饰符不能比抽象方法的访问修饰符更严格。例如,如果抽象方法是
protected
,重写方法可以是protected
或public
,但不能是private
。
具体类中的普通方法重写规则
- 可选择性重写:子类可以选择重写父类的普通方法,以提供更符合自身需求的实现。
- 方法签名必须一致:同样,重写方法的方法名、参数列表和返回类型(协变规则同样适用)必须与父类的普通方法一致。
- 访问修饰符:访问修饰符不能比父类普通方法的访问修饰符更严格。同时,如果父类方法是
final
,则不能被重写。
区别
- 强制重写性:抽象类中的抽象方法强制子类重写(除非子类也是抽象类),而具体类中的普通方法子类可选择是否重写。
- 存在形式:抽象方法只有声明,没有实现(方法体为空);普通方法既有声明也有实现。
举例说明
// 抽象类
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
特性的实现。