为什么首先要有抽象类?

时间:2019-01-04 00:11:04

标签: java class oop object abstract-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";
    }
}

2 个答案:

答案 0 :(得分:5)

  

是否只是创建了抽象类以使开发人员更清楚地了解类的意图?

是的,但是它也阻止开发人员做“愚蠢的”事情。

例如,您不能创建抽象类的实例。在您的代码上下文中,创建“通用” Car没有任何意义。您只能创建BlueCarRedCar或其他子类。尽管anonymous subclass的实例看起来像抽象类的实例,但它们最终都是由子类构建的。但是,如果使Car类抽象化,则开发人员将不会意外地创建Car的实例,因为编译器会抱怨。

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

答案 1 :(得分:-1)

我认识的大多数人都避免使用抽象类。从应用程序程序员的角度来看,我的观点是应避免使用抽象类。使用界面非常灵活,不会强迫您的工作遵循类层次结构。

正式一点:抽象类是严格的继承,而接口是组成

创建类库时,抽象类很有用的示例。抽象类强制执行的层次结构可使应用程序程序员更容易理解该库。但是,我确实相信这样做会以更长的库开发时间为代价。