MST
星途 面试题库

面试题:Java抽象类示例代码解读相关 - 复杂抽象类设计与多态应用

设计一个Java抽象类`GraphicObject`,包含抽象方法`draw`用于绘制图形。然后设计`Rectangle`、`Triangle`和`Ellipse`三个子类继承自`GraphicObject`,分别实现`draw`方法来绘制各自的图形(这里绘制图形可简单通过打印相关信息模拟)。另外,创建一个`GraphicObject`类型的数组,将不同子类的实例放入数组中,并编写代码遍历该数组调用`draw`方法。请解释这种设计体现了Java抽象类的哪些特性以及多态的优势。
32.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
abstract class GraphicObject {
    // 抽象方法,具体实现由子类完成
    public abstract void draw(); 
}

class Rectangle extends GraphicObject {
    @Override
    public void draw() {
        System.out.println("绘制矩形");
    }
}

class Triangle extends GraphicObject {
    @Override
    public void draw() {
        System.out.println("绘制三角形");
    }
}

class Ellipse extends GraphicObject {
    @Override
    public void draw() {
        System.out.println("绘制椭圆");
    }
}

public class Main {
    public static void main(String[] args) {
        GraphicObject[] graphicObjects = new GraphicObject[3];
        graphicObjects[0] = new Rectangle();
        graphicObjects[1] = new Triangle();
        graphicObjects[2] = new Ellipse();

        for (GraphicObject graphicObject : graphicObjects) {
            graphicObject.draw();
        }
    }
}

这种设计体现Java抽象类的特性:

  1. 抽象方法与抽象类GraphicObject类定义了抽象方法draw,它自身也被定义为抽象类。抽象类不能被实例化,其存在意义是为子类提供一个通用的框架和规范,子类必须实现抽象类中的抽象方法,这里RectangleTriangleEllipse子类都实现了draw方法。
  2. 代码复用与继承:子类RectangleTriangleEllipse继承自GraphicObject,继承了GraphicObject类的结构和可能有的通用行为(虽然这里GraphicObject除了抽象方法没有其他行为),实现了代码的复用,减少重复代码的编写。

多态的优势:

  1. 可扩展性:在GraphicObject数组中,可以方便地添加新的GraphicObject子类实例,而不需要修改遍历数组调用draw方法的代码。如果有新的图形类如Circle,只需要让Circle继承GraphicObject并实现draw方法,就可以加入到数组中,遍历代码无需改动。
  2. 灵活性:通过GraphicObject类型的数组存储不同子类实例,在遍历调用draw方法时,Java虚拟机根据对象的实际类型(运行时类型)来决定调用哪个子类的draw方法,而不是根据引用变量的声明类型。这使得代码更加灵活,能够根据不同对象类型执行不同的行为。
  3. 简化代码:不需要针对每个具体图形类型编写单独的处理逻辑,通过统一的GraphicObject引用和draw方法调用来处理不同类型的图形,简化了代码结构,提高了代码的可读性和维护性。