为什么在Java中需要抽象类?

19
为什么我们需要Java中的抽象类?如果你永远不会将其转换为对象,为什么一开始就要有它呢?如何使用它?它的存在原因是什么?
我对抽象方法也感到困惑。我觉得这似乎是一个类似于拥有超类但没有任何可能被创建的子类的概念。

4
相信我,这比他/她上次提出的要温和得多。 - Dawood ibn Kareem
1
没有展现出阅读上次答案的证据,但至少很有礼貌。 - keshlam
@keshlam 可能是在他/她有机会阅读之前被删除了。我在问题被删除的同时进行了编辑,希望能够保存它,但我太慢了。 - Dawood ibn Kareem
这实际上是一个好问题。不幸的是,它已经关闭了。 - user3437460
当你对特定代码块有具体问题时,SO是一个很好的地方。但如果你对“为什么”或整体概念有疑问,或者需要指导,那么它就是一个无情的深渊。 - Tim
3个回答

37

抽象类可以作为其他类的模板类型。这个抽象类将为所有扩展它的类保持共同的功能。

例如:

Abstract Class Animal 

所有动物都会移动、呼吸和繁殖,因此它们可以归入动物类别。

现在,

 Concrete Class Dog, Cat etc.

这些基本功能已经提供。


这是一个不错且简单的解释。我喜欢那个答案。所以你可以使用抽象类的子类。对于抽象方法来说是否也一样,或者不存在子方法? - user3314801
1
如果您感到满意,应该接受它作为答案。 - nafizh
但是如果在抽象类"动物"中声明例如"呼吸()",即使只是声明了"呼吸()"(不带函数的"主体"),我们还需要在"狗"和"猫"中重新创建"呼吸()",那么这种情况下"动物"的好处是什么? - Sushi

26
抽象类允许在一个类中提供一组部分默认的方法实现。由于它们是不完整的,所以不能直接实例化和使用,但可以通过继承来添加特定实现中缺失的细节,并且这些子类可以被实例化。
如果没有抽象类,你将不得不提供那些你打算重写的方法的虚拟实现...虽然这是可行的,但有可能会忘记实现其中之一。一些方法保持完全抽象确保了真正的实现必须填补这些空白,或者继续保持抽象本身并强制它们的子类这样做。
这并不是语言无法没有的东西。但它非常有用。当你在Java和面向对象设计方面变得更熟练时,你会发现它的实用性。

你能否举一个例子,说明在抽象类与另一个类中不需要编写虚拟实现的情况,以及需要编写虚拟实现的情况。我很困惑,希望你能解释并详细阐述一下。 - Vishwa Ratna

16

抽象类有很多用途。抽象类的主要目的是作为基类,可以被子类扩展以创建完整的实现。

例如,您的程序可能需要实现三个步骤:

  • 动作之前的几个步骤
  • 需要执行的一些动作
  • 动作之后的几个步骤

在这种情况下,您可以定义一个带有这三个方法的抽象类,如下所示:

public abstract MyAbstractProcess {
    public void stepBefore() {
        // Implementation directly in abstract superclass
    }

    public abstract void action(); // Implemented by subclasses

    public void stepAfter() {
        // Implementation directly in abstract superclass
    }
}

此外,上述的抽象类Animal示例也是一个非常好的例子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接