MST

星途 面试题库

面试题:Java多态下如何实现通用代码编写之方法重写

请描述在Java中,子类重写父类方法时,需要遵循哪些规则?并结合基于Java多态实现通用代码编写的场景,举例说明如何利用方法重写来编写更具通用性的代码。
16.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

子类重写父类方法的规则

  1. 方法签名必须相同:方法名、参数列表(参数的数量、类型及顺序)必须与父类被重写方法完全一致。
  2. 返回类型兼容:返回类型必须与父类被重写方法的返回类型相同,或者是其子类型(Java 5.0及以上支持协变返回类型)。例如,父类方法返回 Object,子类重写方法可以返回 String,因为 StringObject 的子类。
  3. 访问修饰符限制更宽松或相同:子类重写方法的访问修饰符不能比父类被重写方法的访问修饰符更严格。例如,父类方法是 protected,子类重写方法可以是 protectedpublic,但不能是 private
  4. 不能抛出比父类更多的异常:子类重写方法不能抛出比父类被重写方法声明的检查异常更宽泛的异常类型。父类方法声明抛出 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 类型的数组。通过多态,当传入不同子类(CircleRectangle)的实例时,会调用相应子类重写的 draw 方法,实现了通用代码对不同具体图形的绘制操作,提高了代码的通用性和可维护性。例如:

public class Main {
    public static void main(String[] args) {
        Shape[] shapes = {new Circle(), new Rectangle()};
        DrawingApp.drawShapes(shapes);
    }
}

上述 main 方法创建了 CircleRectangle 的实例,并传递给 drawShapes 方法,该方法会根据对象的实际类型,调用相应子类重写的 draw 方法,输出“绘制一个圆形”和“绘制一个矩形”。