面试题答案
一键面试子类重写父类方法的规则
- 方法签名必须相同:方法名、参数列表(参数的数量、类型及顺序)必须与父类被重写方法完全一致。
- 返回类型兼容:返回类型必须与父类被重写方法的返回类型相同,或者是其子类型(Java 5.0及以上支持协变返回类型)。例如,父类方法返回
Object
,子类重写方法可以返回String
,因为String
是Object
的子类。 - 访问修饰符限制更宽松或相同:子类重写方法的访问修饰符不能比父类被重写方法的访问修饰符更严格。例如,父类方法是
protected
,子类重写方法可以是protected
或public
,但不能是private
。 - 不能抛出比父类更多的异常:子类重写方法不能抛出比父类被重写方法声明的检查异常更宽泛的异常类型。父类方法声明抛出
IOException
,子类重写方法可以声明抛出IOException
或者其子类异常,如FileNotFoundException
,但不能抛出SQLException
等其他不相关的检查异常。
基于Java多态实现通用代码编写的场景及示例
假设有一个图形绘制的场景,我们定义一个父类 Shape
,包含一个绘制方法 draw
。不同的图形(如圆形 Circle
、矩形 Rectangle
)作为子类继承自 Shape
并重写 draw
方法。
// 父类Shape
class Shape {
public void draw() {
System.out.println("绘制一个形状");
}
}
// 子类Circle
class Circle extends Shape {
@Override
public void draw() {
System.out.println("绘制一个圆形");
}
}
// 子类Rectangle
class Rectangle extends Shape {
@Override
public void draw() {
System.out.println("绘制一个矩形");
}
}
// 通用代码编写
class DrawingApp {
public static void drawShapes(Shape[] shapes) {
for (Shape shape : shapes) {
shape.draw();
}
}
}
在上述代码中,DrawingApp
类的 drawShapes
方法接收一个 Shape
类型的数组。通过多态,当传入不同子类(Circle
或 Rectangle
)的实例时,会调用相应子类重写的 draw
方法,实现了通用代码对不同具体图形的绘制操作,提高了代码的通用性和可维护性。例如:
public class Main {
public static void main(String[] args) {
Shape[] shapes = {new Circle(), new Rectangle()};
DrawingApp.drawShapes(shapes);
}
}
上述 main
方法创建了 Circle
和 Rectangle
的实例,并传递给 drawShapes
方法,该方法会根据对象的实际类型,调用相应子类重写的 draw
方法,输出“绘制一个圆形”和“绘制一个矩形”。