java - 首先为什么要有抽象类?

标签 java class oop object abstract-class

我了解创建抽象类背后的概念用途,即为其子类定义一个公共(public)接口(interface),其中一些实现留给各个子类。

我的假设是否正确,即技术上不需要抽象类,因为无论如何您都可以覆盖父类(super class)方法?创建抽象类是为了让开发人员更清楚地了解类的意图吗?

我的意思的例子:

// Using an abstract class
abstract class Car
{
    int fuel;

    int getFuel()
    {
         return this.fuel;
    }

    abstract String getColor();
}

class RedCar extends Car
{
    String getColor()
    {
        return "red";
    }
}


// Without an abstract class
class Car
{
    int fuel;

    int getFuel()
    {
         return this.fuel;
    }

    String getColor()
    {
         return "defaultColor";
    }

class RedCar extends Car
{
    String getColor()
    {
        return "red";
    }
}

最佳答案

Were abstract classes just created to make the intention of the classes clearer to the developer?

没错,但它也可以防止开发人员做“愚蠢”的事情。

例如,您无法创建抽象类的实例。在您的代码上下文中,创建“通用”Car 是没有意义的。您只能创建 BlueCarRedCar 或其他一些子类。虽然 anonymous subclass 的实例可能看起来像抽象类的实例,但它们最终是由子类构造的。但是,如果您将 Car 类抽象化,开发人员就不会意外创建 Car 的实例,因为编译器会提示。

抽象类还迫使开发人员实现抽象方法。使用您的非抽象 Car 类,我可以继承它并忘记我需要重写 getColor。现在,代码的其他部分可能会调用 getColor 并获得无意义的结果“defaultcolor”。默认颜色到底是什么?使方法抽象迫使子类考虑实现所需的方法。

关于java - 首先为什么要有抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54031545/

相关文章:

java - Java中无法将字符串转换为日期

java - 使用jar使用php脚本生成文件

java - 创建某种对象类型的 Mockito 数组

javascript - 如何防止两个 Canvas 对象出现在同一个位置

java - 如何从自己的 validator 验证每个流程对象?

java - NIO2:如何将 URI 一般映射到路径?

python - 创建自定义类QPointF

javascript - 如何将相同的 jQuery 代码应用于同一类的两个实例?

javascript - 一次性转换所有类

oop - 如何在common lisp/CLOS中定义和调用类方法